ret2libc

ret2libc技术总结

1. 32位与64位程序函数传参差异

1.1 32位程序传参方式

  • 传参方式:通过栈传参,属于后传参
  • 典型payload结构
    p32(puts_plt) + p32(main_addr) + p32(puts_got)

1.2 64位程序传参方式

  • 传参方式:通过寄存器传参,参数从左到右依次放入寄存器:rdi, rsi, rdx, rcx, r8, r9
  • 典型payload结构
    p64(rdi_addr) + p64(puts_got) + p64(puts_plt) + p64(main_addr)

2. Write函数在ret2libc中的应用

2.1 Write函数参数说明

  • 第一个参数:文件描述符(0-标准输入,1-标准输出,2-标准错误)
  • 第二个参数:要泄露地址的函数的GOT表
  • 第三个参数:输出的字节数(32位为4字节,64位为8字节)

2.2 32位Write函数传参

p32(write_plt) + p32(main_addr) + p32(1) + p32(write_got) + p32(4)

2.3 64位Write函数传参

p64(rdi_addr) + p64(1) + p64(rsi_addr) + p64(write_got) + p64(rdx_addr) + p64(8) + p64(write_plt) + p64(main_addr)

3. 注意事项

  1. 参数复用:传参时有时可以直接利用程序中已有的参数,避免额外构造
  2. 第三个参数灵活性:当第三个参数由rsi与其他寄存器一起出现时,可以适当简化
  3. 输出描述符选择:标准输出(1)和标准错误(2)都可以用作write函数的第一个参数
  4. 寄存器使用顺序:64位系统中必须严格按照rdi→rsi→rdx→rcx→r8→r9的顺序传参

4. 技术要点

  • 正确识别目标程序的位数(32位/64位)
  • 准确获取所需函数的PLT和GOT表地址
  • 合理构造ROP链,确保参数传递正确
  • 注意栈对齐和函数调用约定

ret2libc
http://x1nglu0.github.io/2025/10/04/ret2libc/
作者
x1nglu0
发布于
2025年10月4日
许可协议