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
|