缓冲区溢出时调用函数

时间:2015-05-24 00:57:33

标签: c buffer-overflow shellcode

我正在学习缓冲区溢出,并发现了一个程序有点像这样的挑战:

int main() {
    do_something()
    return 0;
}

void do_something() {
    //get inputs
    printf("Did something.");
}

void do_something_else() {
    printf("Did something else.")
}

假设do_something()中存在缓冲区溢出,我该如何调用函数do_something_else()

2 个答案:

答案 0 :(得分:4)

调用函数时,编译器会自动将保存的返回地址的值压入堆栈。 之后,它将ebp的值压入堆栈。

因此,当主调用do_something()时,保存的eip,已保存的ebp的值将按顺序被压入堆栈。

保存的eip很可能指向main()中的某个位置。如果用do_something_else()的地址覆盖该地址,do_something_else()函数将在do_something()执行后执行。

所以你的有效载荷应该是这样的:

"(一堆A或者#x90到达ebp" +" BBBB(随机值来填充ebp)" +" (do_something_else()的地址)" 希望有所帮助。

答案 1 :(得分:1)

您所询问的内容称为shellcoding。您可以从http://insecure.org/stf/smashstack.html开始介绍。基本思想是你将do_something读取输入到固定大小的缓冲区。然后你将更多的数据发送到缓冲区,以便它覆盖堆栈上的数据,如果你恰到好处地写它,你可以使保留返回地址的地点指向do_something_else,所以当{{1试图返回它会到你想要的地方

您需要使用调试器来获取do_something函数的正确地址,并且可能需要获取覆盖缓冲区所需的实际字节数以获取返回地址。