题目代码(https://github.com/zhengmin1989/ROP_STEP_BY_STEP

    1. #undef _FORTIFY_SOURCE
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <unistd.h>
    5. void vulnerable_function() {
    6. char buf[128];
    7. read(STDIN_FILENO, buf, 512);
    8. }
    9. int main(int argc, char** argv) {
    10. write(STDOUT_FILENO, "Hello, World\n", 13);
    11. vulnerable_function();
    12. }

    file一下
    image.png
    因为这个是64位的程序了,那我们就要对64位程序的传参做个了解

    • 64位不像32位参数都在栈上,在x64程序中,前六个整型或指针参数依次保存在RDI, RSI, RDX, RCX, R8 和 R9 寄存器中,如果还有更多的参数的话才会保存在栈上。
    • 在 64 位程序中,函数的前 6 个参数是通过寄存器传递的,但是大多数时候,我们很难找到每一个寄存器对应的 gadgets。 这时候,我们可以利用 x64 下的 __libc_csu_init 中的 gadgets。这个函数是用来对 libc 进行初始化操作的,而一般的程序都会调用 libc 函数,所以这个函数一定会存在。

    了解之后 我们看一下保护措施
    checksec level5
    image.png
    可以看见开了NX
    从源代码可以看出 read函数有溢出 完事 还有个write函数