缓冲区溢出调用函数

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() 的地址)” 希望有所帮助。


Eri*_*ouf 4

你问的是所谓的shellcoding。您可以从http://insecure.org/stf/smashstack.html获取介绍。基本思想是您将把do_something 输入读取到固定大小的缓冲区中。然后,您将向缓冲区发送更多数据,以便覆盖堆栈上的数据,如果您写得恰到好处,您可以使保存返回地址的位置指向do_something_else,因此当do_something尝试返回时,它将到达您所在的位置想要它

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