我正在学习缓冲区溢出,并发现了一个程序有点像这样的挑战:
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()
?
答案 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
函数的正确地址,并且可能需要获取覆盖缓冲区所需的实际字节数以获取返回地址。