gpt4 book ai didi

c - 通过堆栈溢出重定向指令指针

转载 作者:太空宇宙 更新时间:2023-11-04 00:09:29 28 4
gpt4 key购买 nike

我一直在阅读 The Shellcoder's Handbook (2e) 并一直在尝试重现第 18-23 页上的堆栈溢出实验。

我有这个代码

void return_input (void)
{
char array[30];
gets (array);
printf(“%s\n”, array);
}
main()
{
return_input();
return 0;
}

编译:gcc -fno-stack-protector -o overflow overflow.c

函数 main 的汇编代码转储:

0x080483ea <main+0>:  push %ebp
0x080483eb <main+1>: mov %esp,%ebp
0x080483ed <main+3>: call 0x80483c4 <return_input>
0x080483f2 <main+8>: mov $0x0,%eax
0x080483f7 <main+13>: pop %ebp
0x080483f8 <main+14>: ret

我们可以用调用return_input()的地址覆盖保存的返回地址

$ printf
"AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDD\xed\x83\x04\x08" | ./overflow
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDí
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDò

所以这会导致我们的输入被打印两次。但是,第二次没有提示我输入。第二次调用 return_input() 不应该导致第二次调用 gets() 吗?

最佳答案

这可能与 gets() 从标准输入读取的内容有关。

程序的略微改动:

#include <stdio.h>

int n = 1;

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

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

如果我只是运行它,我可以输入 2 个短字符串(每个字符串后跟 Enter 键),如下所示:

C:\gets.exe
qwe
qwe
123
123

这里 qwe 和 123 都在屏幕上重复出现(第一次是我键入它们,第二次是当它们被打印时)。

当我使用 echo 命令在 Windows 上通过管道输入程序时,我得到以下内容而没有机会输入第二个字符串,gets() 在第二次调用时以某种方式设法获取垃圾作为输入:

C:\echo qwe|gets.exe
qwe
№  ☺

因此,gets() 读取管道输入的方式出了点问题,这与堆栈溢出无关。

关于c - 通过堆栈溢出重定向指令指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7855963/

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