64位寄存器传参小结

单独拿出来强调一下

32位,参数都是保存在栈上面的
基本构造

rop:
buffer padding
target function
return addr
ager1
ager2

32位直接溢出后覆盖返回地址,再传参就完了

64位,寄存器传参
基本构造

传参方式:首先将系统调用号传入 rax,然后将前六个参数从左到右依次存入 rdi,rsi,rdx,rcx,r8,r9寄存器中,再有参数才是放到栈上返回值存在rax寄存器

rop:
buffer padding
pop rdi
pop rsi
… #(pop rdx;pop rcx;pop r8;pop r9;…)
target function

64位溢出后需要利用寄存器来传参,这就涉及到利用寄存器的方法,有的题给了gadget可以利用,有的题gadget用不了的,需要另想办法,比如_libc_csu_init函数劫持,系统调用signreturn函数等,重点是想办法利用寄存器。

_libc_csu_init函数:

里面有一段是连续pop寄存器
file

gadget 位于 0x4006AA 和 0x400690地址
先借用0x4006AA 处的gadget pop寄存器,给参数
顺序依次 rbx,rbp,r12,r13,r14,r15 特别是rbx=0 rbp=1 r12=target_function
然后再调用 0x400690处的gadget将 r13,r14,r15 的值赋给 rdx,rsi,edi

r13=rdx=arg3
r14=rsi=arg2
r15d=edi=arg1
r12= arget_function

下次专门写一篇寄存器仔细的讲解

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据