我有一個緩衝區溢出問題,我需要解決。下面的問題是,在底部是我的問題:緩衝區溢出緩衝區長度
#include <stdio.h>
#include <string.h>
void lan(void) {
printf("Your loyalty to your captors is touching.\n");
}
void vulnerable(char *str) {
char buf[LENGTH]; //Length is not given
strcpy(buf, str); //str to fixed size buf (uh-oh)
}
int main(int argc, char **argv) {
if (argc < 2)
return -1;
vulnerable(argv[1]);
return 0;
}
(gdb) disass vulnerable
0x08048408: push %ebp
0x08048409: mov %esp, %ebp
0x0804840b: sub $0x88, %esp
0x0804840e: mov 0x8(%ebp), %eax
0x08048411: mov %eax, 0x4(%esp)
0x08048415: lea -0x80(%ebp), %eax
0x08048418: mov %eax, (%esp)
0x0804841b: call 0x8048314 <strcpy>
0x08048420: leave
0x08048421: ret
End of assembler dump.
(gdb) disass lan
0x080483f4: push %ebp
0x080483f5: mov %esp, %ebp
0x080483f7: sub $0x4, %esp
0x080483fa: movl $0x8048514, (%esp)
0x08048401: call 0x8048324 <puts>
0x08048406: leave
0x08048407: ret
End of assembler dump.
然後我們有以下信息:
(gdb) break *0x08048420
Breakpoint 1 at 0x8048420
(gdb) run 'perl -e' print "\x90" x Length' 'AAAABBBBCCCCDDDDEEEE'
Breakpoint 1, 0x08048420 in vulnerable
(gdb) info reg $ebp
ebp 0xffffd61c 0xffffd61c
(gdb) # QUESTION: Where in memory does the buf buffer start?
(gdb) cont
Program received signal SIGSEGV, Segmentation fault.
最後,perl的命令是編寫出的字符長度副本速記0×90。
我已經完成了這樣的一些問題,但是這裏阻礙了我的下列問題:「通過查看彙編代碼,LENGTH的價值是什麼?
我不知道如何從給定的彙編代碼中找到它。我所知道的是......我們寫入的緩衝區位於堆棧的位置-128(%ebp)(其中-128是十進制數)。但是,我不確定從哪裏去獲得緩衝區的長度。
謝謝@Jester,這就是我的想法(阻止我回答問題)。這是來自我的學校的一次舊考試中的一個問題,當我不知道編譯器放在那裏有多少填充時,我覺得(並且仍然覺得)回答有多大的LENGTH是很奇怪的。 – user2451412