0%

ret2csu万能gadget

ret2csu万能gadget

1
2
3
4
5
6
#万能gadget1:
pop rbx; pop rbp; pop r12; pop r13; pop r14; pop r15; retn

#万能gadget2:
mov rdx, r13; mov rsi, r14; mov edi, r15d; call qword ptr [r12+rbx*8]; add rbx, 1; cmp rbx, rbp; jnz short loc_400620

分析可得:处理后栈结构中布置的数据将要依次存入以下寄存器中—— 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,从而可能引起段错误。