我正在阅读Shellcoder的手册,并尝试在堆栈示例中继续使用简单的溢出缓冲区,但我已经卡住了。
我在Windows上运行GCC,在函数调用之前而不是像书中所说的那样推送堆栈,它只是将值移动到寄存器然后进行调用。这本书正在运行linux我认为,它是否使用与windows不同的调用方法?我如何获得linux行为?
此外,当程序接受用户输入时,如何将数据输入到程序中以便在gdb中显示?
答案 0 :(得分:1)
看起来你的书在IA32平台上假设了cdecl
调用约定,但你的编译器正在使用一个不同的调用约定来将参数放在寄存器中。您是否有机会使用AMD64平台? AMD64的标准是将第一个n
参数放在寄存器中,并且只在堆栈上添加其他参数(Windows仅使用四个寄存器作为参数;每个其他公共平台使用六个)。
有关调用约定的更多信息:https://en.wikipedia.org/wiki/X86_calling_conventions
如果你在你关心的那些之前添加了一堆额外的函数参数,你应该得到堆栈中的最后一个。或者,如果您编译为32位而不是64位,您可能会得到您正在寻找的东西。