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()函数的参数在地址空间中的位置.任何人都可以帮我弄清楚我能在哪里找到这个论点?
x86-64上使用的调用约定在寄存器中传递参数.第一个参数在RDI中传递.这是与x86的主要区别,其中参数通常在堆栈上传递.
要将精心设计的参数传递给函数,您需要通过以下方式使其出现在RDI中:
制作main()把该值存在.(在这种情况下可能不可能.)
使用ROP小工具.pop %rdi; retq在内存中查找指令序列,然后按顺序返回该序列的地址,该地址包含堆栈"/bin/sh"和地址system().
如果您找不到确切的序列,则可以使用包含RDI的不同弹出并返回序列,并推送额外的垃圾值以适应它.例如,如果你找到了a pop %rdi; pop %rbp; retq,你就会在精心设计的RDI之后推出一个额外的值.
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |