Jam*_*Dai 3 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.")
}
Run Code Online (Sandbox Code Playgroud)
假设 中存在缓冲区溢出do_something(),我将如何使其调用该函数do_something_else()?
小智 7
当一个函数被调用时,编译器会自动将保存的返回地址的值压入堆栈。之后,它将 ebp 的值压入堆栈。
因此,当 main 调用 do_something() 时,saved eip、saved ebp 的值将按此顺序压入堆栈。
保存的 eip 很可能指向 main() 中的某个地方。如果用 do_something_else() 的地址覆盖该地址,则 do_something_else() 函数将在 do_something() 执行后执行。
所以你的有效载荷应该是这样的:
“(一堆 A 或 \x90 达到 ebp”+“BBBB(随机值填充 ebp)”+“(do_something_else() 的地址)” 希望有所帮助。
你问的是所谓的shellcoding。您可以从http://insecure.org/stf/smashstack.html获取介绍。基本思想是您将把do_something 输入读取到固定大小的缓冲区中。然后,您将向缓冲区发送更多数据,以便覆盖堆栈上的数据,如果您写得恰到好处,您可以使保存返回地址的位置指向do_something_else,因此当do_something尝试返回时,它将到达您所在的位置想要它
您需要使用调试器来获取函数的正确地址do_something_else,并且可能需要获取覆盖缓冲区以获取返回地址所需的实际字节数。
| 归档时间: |
|
| 查看次数: |
6563 次 |
| 最近记录: |