题目代码(https://github.com/zhengmin1989/ROP_STEP_BY_STEP)
#undef _FORTIFY_SOURCE#include <stdio.h>#include <stdlib.h>#include <unistd.h>void vulnerable_function() {char buf[128];read(STDIN_FILENO, buf, 512);}int main(int argc, char** argv) {write(STDOUT_FILENO, "Hello, World\n", 13);vulnerable_function();}
file一下
因为这个是64位的程序了,那我们就要对64位程序的传参做个了解
- 64位不像32位参数都在栈上,在x64程序中,前六个整型或指针参数依次保存在RDI, RSI, RDX, RCX, R8 和 R9 寄存器中,如果还有更多的参数的话才会保存在栈上。
- 在 64 位程序中,函数的前 6 个参数是通过寄存器传递的,但是大多数时候,我们很难找到每一个寄存器对应的 gadgets。 这时候,我们可以利用 x64 下的 __libc_csu_init 中的 gadgets。这个函数是用来对 libc 进行初始化操作的,而一般的程序都会调用 libc 函数,所以这个函数一定会存在。
了解之后 我们看一下保护措施
checksec level5
可以看见开了NX
从源代码可以看出 read函数有溢出 完事 还有个write函数
