在x86_64汇编实验中,stdlib.h的system()函数的参数在哪里?

Jay*_*Jay 0 x86 assembly buffer-overflow

我是系统安全的新手,我正在尝试实现一个简单的返回libc漏洞.有了GCC的-fno-stack-protector设置,现在我知道如何利用缓冲区溢出错误来粉碎返回地址.现在我想system()通过覆盖函数的正确返回地址来引导目标程序的控制流程到C 函数system()(我用-static选项集编译程序,以便所有C的标准函数都在可执行代码中) .例如,目标程序如下:

int main(int argc, char *argv[]) {
    char buffer[8];
    gets(buffer);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我可以main()使用system()gdb的反汇编函数找到的地址覆盖返回地址.我想提供"/ bin/sh"作为参数system(),但我不知道system()函数的参数在地址空间中的位置.任何人都可以帮我弄清楚我能在哪里找到这个论点?

dus*_*uff 5

x86-64上使用的调用约定在寄存器中传递参数.第一个参数在RDI中传递.这是与x86的主要区别,其中参数通常在堆栈上传递.

要将精心设计的参数传递给函数,您需要通过以下方式使其出现在RDI中:

  1. 制作main()把该值存在.(在这种情况下可能不可能.)

  2. 使用ROP小工具.pop %rdi; retq在内存中查找指令序列,然后按顺序返回该序列的地址,该地址包含堆栈"/bin/sh"和地址system().

    如果您找不到确切的序列,则可以使用包含RDI的不同弹出并返回序列,并推送额外的垃圾值以适应它.例如,如果你找到了a pop %rdi; pop %rbp; retq,你就会在精心设计的RDI之后推出一个额外的值.