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. 注意事项
- 参数复用:传参时有时可以直接利用程序中已有的参数,避免额外构造
- 第三个参数灵活性:当第三个参数由rsi与其他寄存器一起出现时,可以适当简化
- 输出描述符选择:标准输出(1)和标准错误(2)都可以用作write函数的第一个参数
- 寄存器使用顺序:64位系统中必须严格按照rdi→rsi→rdx→rcx→r8→r9的顺序传参
4. 技术要点
- 正确识别目标程序的位数(32位/64位)
- 准确获取所需函数的PLT和GOT表地址
- 合理构造ROP链,确保参数传递正确
- 注意栈对齐和函数调用约定
ret2libc
      http://x1nglu0.github.io/2025/10/04/ret2libc/