所以我正在为一个安全类做一个赋值,赋值是使用堆栈溢出来调用从未使用它的程序函数oopsDidISmashTheStack。
#include <stdio.h>
#include <stdlib.h>
int oopsDidISmashTheStack(void)
{
printf("Yup, smashing the stack is fun!n");
exit(0);
}
int getUserInput (void)
{
char buf[12];
gets(buf);
return(1);
}
int main(void)
{
getUserInput ();
printf("Overflow failed, normal returnn");
return(1);
}
我理解 buf 变量之后的概念是 sfp,然后是返回地址,我无法弄清楚的是将返回值更改为函数所在的地址0x080484fc输入。我认为填充缓冲区需要 12 个字符,然后我的印象是 sfp 并返回 4 个字节,所以我尝试用另外 4 个随机字符填充 sfp,然后使用 \xfc\x84\x04\x08 使返回地址指向函数。
如果有人熟悉堆栈内存的工作原理并且可以解释我出错的地方,那就太好了?
你几乎走在正确的轨道上。 我建议你看看堆栈,看看返回地址是否在你认为的位置。 里面可能还有其他东西。 还要仔细检查终点,
我假设这是您的输入字符串?
"012345678901xxxx\xfc\x84\x04\x08"
程序的输出是什么,通常如果您很接近但不太正确,程序会崩溃:)