私はこの演習を行っています: http://exploit-exercises.com/protostar/stack5
1#include <stdlib.h>
2#include <unistd.h>
3#include <stdio.h>
4#include <string.h>
5
6int main(int argc, char **argv)
7{
8 char buffer[64];
9
10 gets(buffer);
11}
gdb を使用してデバッグします。
(gdb) disassemble main
Dump of assembler code for function main:
0x080483c4 <main+0>: push %ebp
0x080483c5 <main+1>: mov %esp,%ebp
0x080483c7 <main+3>: and $0xfffffff0,%esp
0x080483ca <main+6>: sub $0x50,%esp
0x080483cd <main+9>: lea 0x10(%esp),%eax
0x080483d1 <main+13>: mov %eax,(%esp)
0x080483d4 <main+16>: call 0x80482e8 <gets@plt>
0x080483d9 <main+21>: leave
0x080483da <main+22>: ret
アセンブラー・ダンプの終わり。
(gdb) b main
Breakpoint 1 at 0x80483cd: file stack5/stack5.c, line 10.
(gdb) r
Starting program: /opt/protostar/bin/stack5
Breakpoint 1, main (argc=1, argv=0xbffff874) at stack5/stack5.c:10
10 stack5/stack5.c: No such file or directory.
in stack5/stack5.c
(gdb) i r
eax 0xbffff874 -1073743756
ecx 0x37ca089a 935987354
edx 0x1 1
ebx 0xb7fd7ff4 -1208123404
esp 0xbffff770 0xbffff770
ebp 0xbffff7c8 0xbffff7c8
esi 0x0 0
edi 0x0 0
eip 0x80483cd 0x80483cd <main+9>
eflags 0x200282 [ SF IF ID ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
(gdb)
(gdb) x/x buffer
0xbffff7d8: 0xbffff87c
バッファ アドレスが $ebp よりも大きいことがわかりました。これはローカル変数です。理解できません。$esp と $ebp の間である必要があると思います。
(gdb) b *main+21
Breakpoint 2 at 0x80483d9: file stack5/stack5.c, line 11.
(gdb) c
Continuing.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Breakpoint 2, main (argc=1, argv=0xbffff874) at stack5/stack5.c:11
11 in stack5/stack5.c
(gdb) x/40x $esp
0xbffff770: 0xbffff780 0xb7ec6165 0xbffff788 0xb7eada75
0xbffff780: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff790: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff7a0: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff7b0: 0x41414141 0x41414141 0x00414141 0xb7fd7ff4
0xbffff7c0: 0x080483f0 0x00000000 0xbffff848 0xb7eadc76
0xbffff7d0: 0x00000001 0xbffff874 0xbffff87c 0xb7fe1848
0xbffff7e0: 0xbffff830 0xffffffff 0xb7ffeff4 0x08048232
0xbffff7f0: 0x00000001 0xbffff830 0xb7ff0626 0xb7fffab0
0xbffff800: 0xb7fe1b28 0xb7fd7ff4 0x00000000 0x00000000
(gdb)
上記から、バッファー アドレスは 0xbffff780 であり、gdb の printf とは異なります。
(gdb) x/x buffer
0xbffff7d8: 0xbffff87c
だから、私はそれを理解することはできません。どうしたの?