gpt4 book ai didi

c - 缓冲区溢出的困境

转载 作者:太空狗 更新时间:2023-10-29 17:23:04 25 4
gpt4 key购买 nike

我正在玩一个堆栈溢出示例。这个例子看起来像这样:

 void return_input (void){ 
char array[30];
gets (array);
printf("%s\n", array);

}

main() {
return_input();
return 0;
}

所有这些代码都在名为 overflow.c 的文件中。我们有名为 return_input 的易受攻击函数,特别是它是一个 30 字节的字符数组。我编译它并在 gdb 中打开易受攻击的函数并得到以下输出:

 (gdb) disas return_input
0x08048464 <+0>: push %ebp
0x08048465 <+1>: mov %esp,%ebp
0x08048467 <+3>: sub $0x48,%esp
0x0804846a <+6>: mov %gs:0x14,%eax
0x08048470 <+12>: mov %eax,-0xc(%ebp)
0x08048473 <+15>: xor %eax,%eax
0x08048475 <+17>: lea -0x2a(%ebp),%eax
0x08048478 <+20>: mov %eax,(%esp)
0x0804847b <+23>: call 0x8048360 <gets@plt>
0x08048480 <+28>: lea -0x2a(%ebp),%eax
0x08048483 <+31>: mov %eax,(%esp)
0x08048486 <+34>: call 0x8048380 <puts@plt>
0x0804848b <+39>: mov -0xc(%ebp),%eax
0x0804848e <+42>: xor %gs:0x14,%eax
0x08048495 <+49>: je 0x804849c <return_input+56>
0x08048497 <+51>: call 0x8048370 <__stack_chk_fail@plt>
0x0804849c <+56>: leave
0x0804849d <+57>: ret
End of assembler dump.

正如您从函数序言中看到的那样,我们在堆栈上为局部变量保留了 hex48(dec 72) 字节。首先,我试图找到我们易受攻击的数组在堆栈中开始的地址。我认为它是 -0x2a(%ebp),对吗? Hex2a 是十进制的 42。据我了解,这意味着我们可以在开始覆盖保存在堆栈中的 EBP 之前安全地写入 42 个字节。但是当我运行这个例子时,只需要正确的 37 个字节就可以得到段错误:

rustam@rustam-laptop:~/temp/ELF_reader$ ./overflow
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Segmentation fault (core dumped)

37 字节如何足以溢出缓冲区?如果我们的本地 char 数组是来自保存的 EBP 的 -42 字节

最佳答案

如果没有看到函数的整个反汇编,很难分辨。

但是,我猜测存储在 -0xc(%ebp) 的 %gs:0x14 可能是您的 stack canary如果检测到堆栈损坏,则会导致干净退出。所以这个值存储在 -0xc(%ebp),这意味着您的缓冲区实际上只有 30 个字节大,后面是任何内容。

关于c - 缓冲区溢出的困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11069615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com