单独拿出来强调一下
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寄存器
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
下次专门写一篇寄存器仔细的讲解