C 堆栈上的缓冲区溢出

C 堆栈上的缓冲区溢出,c,gdb,C,Gdb,我正在阅读Shellcoder手册,并试图按照堆栈示例中的简单溢出缓冲区进行操作,但我被卡住了 我在windows上运行GCC,在函数调用之前,它只是将值移动到寄存器中,然后进行调用,而不是像书中所说的那样推动堆栈。我想这本书运行的是linux,它是否使用了与windows不同的调用方法?如何获得linux行为 另外,当一个程序接受用户输入时,我如何将数据输入到程序中,使其显示在gdb中 您的书似乎假设在IA32平台上使用cdecl调用约定,但您的编译器使用不同的调用约定,将参数放入寄存器中。您

我正在阅读Shellcoder手册,并试图按照堆栈示例中的简单溢出缓冲区进行操作,但我被卡住了

我在windows上运行GCC,在函数调用之前,它只是将值移动到寄存器中,然后进行调用,而不是像书中所说的那样推动堆栈。我想这本书运行的是linux,它是否使用了与windows不同的调用方法?如何获得linux行为


另外,当一个程序接受用户输入时,我如何将数据输入到程序中,使其显示在gdb中

您的书似乎假设在IA32平台上使用
cdecl
调用约定,但您的编译器使用不同的调用约定,将参数放入寄存器中。您是否有可能使用AMD64平台?AMD64的标准是将第一个
n
参数放在寄存器中,并且在堆栈上只放额外的参数(Windows仅使用四个寄存器作为参数;其他通用平台使用六个寄存器)

有关调用约定的更多信息:


如果在所关心的函数参数之前添加一组附加函数参数,则应该得到堆栈上的最后一个。或者,如果编译为32位而不是64位,则可能会得到所需的内容

尝试关闭优化。我尝试了:gcc-ggdb function.c-O0-o function,但没有帮助。我该怎么做?调用约定是微型计算机的一个属性?操作系统?当一个程序接受用户输入时,我如何将数据输入到程序中,使其显示在gdb中?抱歉问了这么多问题。顺便说一句,我很感谢你的帮助。电话会议受到很多因素的影响。IA32上使用了许多调用约定。AMD64建议基于寄存器的参数传递,但在使用中有两种常见的变量。编译器最终是选择调用约定的对象,尽管如果要调用其他模块(如库或进行系统调用),则需要使用与其他模块兼容的调用约定。以32位方式编译似乎是可行的。它是:mov-DWORD-PTR[esp+0x4],0x2。我猜你不确定用户输入的问题?谢谢你。