我们要知道64位程序中函数的前6个参数分别是通过1.rdi、2.rsi、3.rdx、4.rcx、5.r8、6.r9这六个寄存器传递,当然如果参数多余6个,那就需要到栈中寻找.
以一步一步学ROP之x64篇中的level5为例

开启了nx考虑构造rop,ida64打开看一下_libc_csu_init函数


一个溢出漏洞,也没有什么后门函数或者/bin/sh字符串,已经知道了_libc_csu_init的位置那就选取gadgets构造rop
gadgets1

0x0400606–0x0400628这段地址可以通过构造栈溢出来控制rbx,rbp,r12,r13,r14,r15的值,并通过覆盖0x0400628的retn来返回到我们需要的位置
gadgets2

0x04005f0–0x04005f9这段地址中,r15的值赋给rdx,r14的值赋给rsi,r13的值赋给rbi(这里是rdi的低32位,高32位寄存器的值为0,这里只能控制了rdi的低32位)。并且0x04005f9这里有个call是由r12和rbx联合控制,那我们如果控制了r12和rbx岂不是可以call到我们想到的位置。