ret2csu万能gadget
1 | #万能gadget1: |
分析可得:处理后栈结构中布置的数据将要依次存入以下寄存器中—— rbx, rbq, r12, rdx, rsi, edi
在这些寄存器中,主要关注的是 r12, rdx, rsi, edi寄存器,
他们分别保存着将要调用函数的指针的地址、第三个参数、第二个参数和第一个参数。
而rbx和rbp必须的需要将它们的值置为0和1。
原因:在gadget2中,我们call了 [r12+rbx8] ,将rbx置为0即 [r12+rbx8] == [r12],方便我们传参。而设置rbp为1是因为 add rbx, 1; cmp rbx, rbp; jnz xxxxxx 。由于我们通常使rbx=0,从而使r12+rbx*8 = r12,所以call指令结束后rbx必然会变成1。若此时rbp != 1,jnz会再次进行call,从而可能引起段错误。