Exploit Education Phoenix x86 Format Three
Introduction Format Three is the continuation of the format string vulnerability challenges. Recon 1 $ r2 /opt/phoenix/i486/format-three 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 [0x08048350]> aas Cannot analyze at 0x080485e0 [0x08048350]> afl 0x080482d8 1 17 sym._init 0x080484a0 7 277 -> 112 sym.frame_dummy 0x080485a0 5 49 sym.__do_global_ctors_aux 0x080485d1 1 12 sym._fini 0x08048420 8 113 -> 111 sym.__do_global_dtors_aux 0x08048114 40 492 -> 577 sym..interp 0x08048350 1 62 entry0 0x08048340 1 6 sym.imp.__libc_start_main 0x080486a8 1 14 loc.__GNU_EH_FRAME_HDR 0x080486cc 3 34 sym..eh_frame 0x08048708 1 10 obj.__EH_FRAME_BEGIN 0x08048390 4 49 -> 40 sym.deregister_tm_clones 0x0804874c 1 4 obj.__FRAME_END 0x080484fc 6 155 main 0x08048310 1 6 sym.imp.puts 0x08048320 1 6 sym.imp.read 0x08048330 1 6 sym.imp.exit 0x080484e5 1 23 sym.bounce 0x08048300 1 6 sym.imp.printf [0x08048350]> s main [0x080484fc]> pdf / (fcn) main 155 | int main (int argc, char **argv, char **envp); | ; var int32_t var_1008h @ ebp-0x1008 | ; arg int32_t arg_4h @ esp+0x4 | ; DATA XREF from entry0 @ 0x8048384 | 0x080484fc 8d4c2404 lea ecx, [arg_4h] | 0x08048500 83e4f0 and esp, 0xfffffff0 | 0x08048503 ff71fc push dword [ecx - 4] | 0x08048506 55 push ebp | 0x08048507 89e5 mov ebp, esp | 0x08048509 51 push ecx | 0x0804850a 81ec04100000 sub esp, 0x1004 | 0x08048510 83ec0c sub esp, 0xc | 0x08048513 68e0850408 push str.Welcome_to_phoenix_format_three__brought_to_you_by_https:__exploit.education ; sym..rodata | ; 0x80485e0 ; "Welcome to phoenix/format-three, brought to you by https://exploit.education" | 0x08048518 e8f3fdffff call sym.imp.puts ; int puts(const char *s) | 0x0804851d 83c410 add esp, 0x10 | 0x08048520 83ec04 sub esp, 4 | 0x08048523 68ff0f0000 push 0xfff | 0x08048528 8d85f8efffff lea eax, [var_1008h] | 0x0804852e 50 push eax | 0x0804852f 6a00 push 0 | 0x08048531 e8eafdffff call sym.imp.read ; ssize_t read(int fildes, void *buf, size_t nbyte) | 0x08048536 83c410 add esp, 0x10 | 0x08048539 85c0 test eax, eax | ,=< 0x0804853b 7f0a jg 0x8048547 | | 0x0804853d 83ec0c sub esp, 0xc | | 0x08048540 6a01 push 1 ; 1 | | 0x08048542 e8e9fdffff call sym.imp.exit ; void exit(int status) | `-> 0x08048547 83ec0c sub esp, 0xc | 0x0804854a 8d85f8efffff lea eax, [var_1008h] | 0x08048550 50 push eax | 0x08048551 e88fffffff call sym.bounce | 0x08048556 83c410 add esp, 0x10 | 0x08048559 a144980408 mov eax, dword [obj.changeme] ; [0x8049844:4]=0 | 0x0804855e 3d45784564 cmp eax, 0x64457845 | ,=< 0x08048563 7512 jne 0x8048577 | | 0x08048565 83ec0c sub esp, 0xc | | 0x08048568 6830860408 push str.Well_done__the__changeme__variable_has_been_changed_correctly ; 0x8048630 ; "Well done, the 'changeme' variable has been changed correctly!" | | 0x0804856d e89efdffff call sym.imp.puts ; int puts(const char *s) | | 0x08048572 83c410 add esp, 0x10 | ,==< 0x08048575 eb16 jmp 0x804858d | |`-> 0x08048577 a144980408 mov eax, dword [obj.changeme] ; [0x8049844:4]=0 | | 0x0804857c 83ec08 sub esp, 8 | | 0x0804857f 50 push eax | | 0x08048580 6870860408 push str.Better_luck_next_time___got_0x_08x__wanted_0x64457845 ; 0x8048670 ; "Better luck next time - got 0x%08x, wanted 0x64457845!\n" | | 0x08048585 e876fdffff call sym.imp.printf ; int printf(const char *format) | | 0x0804858a 83c410 add esp, 0x10 | | ; CODE XREF from main @ 0x8048575 | `--> 0x0804858d 83ec0c sub esp, 0xc | 0x08048590 6a00 push 0 \ 0x08048592 e899fdffff call sym.imp.exit ; void exit(int status) [0x080484fc]> agf [0x080484fc]> # int main (int argc, char **argv, char **envp); .------------------------------------------------------------------------------------------. | 0x80484fc | | (fcn) main 155 | | int main (int argc, char **argv, char **envp); | | ; var int32_t var_1008h @ ebp-0x1008 | | ; arg int32_t arg_4h @ esp+0x4 | | ; DATA XREF from entry0 @ 0x8048384 | | lea ecx, [arg_4h] | | and esp, 0xfffffff0 | | push dword [ecx - 4] | | push ebp | | mov ebp, esp | | push ecx | | sub esp, 0x1004 | | sub esp, 0xc | | ; sym..rodata | | ; 0x80485e0 | | ; "Welcome to phoenix/format-three, brought to you by https://exploit.education" | | push str.Welcome_to_phoenix_format_three__brought_to_you_by_https:__exploit.education | | ; int puts(const char *s) | | call sym.imp.puts;[oa] | | add esp, 0x10 | | sub esp, 4 | | push 0xfff | | lea eax, [var_1008h] | | push eax | | push 0 | | ; ssize_t read(int fildes, void *buf, size_t nbyte) | | call sym.imp.read;[ob] | | add esp, 0x10 | | test eax, eax | | jg 0x8048547 | `------------------------------------------------------------------------------------------' f t | | | '---------------------------------------. '-----------. | | | .-------------------------. .----------------------------------. | 0x804853d | | 0x8048547 | | sub esp, 0xc | | sub esp, 0xc | | ; 1 | | lea eax, [var_1008h] | | push 1 | | push eax | | ; void exit(int status) | | call sym.bounce;[od] | | call sym.imp.exit;[oc] | | add esp, 0x10 | `-------------------------' | ; [0x8049844:4]=0 | | mov eax, dword [obj.changeme] | | cmp eax, 0x64457845 | | jne 0x8048577 | `----------------------------------' f t | | | '---------------. .-------------------------------------------------------------' | | | .---------------------------------------------------------------------------. .-------------------------------------------------------------------. | 0x8048565 | | 0x8048577 | | sub esp, 0xc | | ; [0x8049844:4]=0 | | ; 0x8048630 | | mov eax, dword [obj.changeme] | | ; "Well done, the 'changeme' variable has been changed correctly!" | | sub esp, 8 | | push str.Well_done__the__changeme__variable_has_been_changed_correctly | | push eax | | ; int puts(const char *s) | | ; 0x8048670 | | call sym.imp.puts;[oa] | | ; "Better luck next time - got 0x%08x, wanted 0x64457845!\n" | | add esp, 0x10 | | push str.Better_luck_next_time___got_0x_08x__wanted_0x64457845 | | jmp 0x804858d | | ; int printf(const char *format) | `---------------------------------------------------------------------------' | call sym.imp.printf;[oe] | v | add esp, 0x10 | | `-------------------------------------------------------------------' | v | | '-----------------------------------------------------------. | | .-----------------' | | .-----------------------------------. | 0x804858d | | ; CODE XREF from main @ 0x8048575 | | sub esp, 0xc | | push 0 | | ; void exit(int status) | | call sym.imp.exit;[oc] | `-----------------------------------' [0x080484fc]> pdf @ sym.bounce / (fcn) sym.bounce 23 | sym.bounce (int32_t arg_8h); | ; arg int32_t arg_8h @ ebp+0x8 | ; CALL XREF from main @ 0x8048551 | 0x080484e5 55 push ebp | 0x080484e6 89e5 mov ebp, esp | 0x080484e8 83ec08 sub esp, 8 | 0x080484eb 83ec0c sub esp, 0xc | 0x080484ee ff7508 push dword [arg_8h] | 0x080484f1 e80afeffff call sym.imp.printf ; int printf(const char *format) | 0x080484f6 83c410 add esp, 0x10 | 0x080484f9 90 nop | 0x080484fa c9 leave \ 0x080484fb c3 ret The binary is almost identical with the one from the previous level. The only difference is that the value to be written to the address of the flag obj.changeme is 0x64457845. ...