ROP 链使用小工具,它们是执行基本功能的短代码片段。您在视频中的 Python 脚本中看到的说明是小工具名称,这些名称是在开始时选择的。
例如,该XOREAX小工具是位于 address 的代码片段0x080512c0,其中包含以下说明:
xor eax, eax
ret
因此,当XOREAX小工具被调用时,eax寄存器被清除并ret执行一条指令。因为ret从堆栈中加载一个地址并跳转到该地址,因此该指令用于调用下一个小工具。
您在 Python 脚本中看到的是有效载荷的构造,它将被放入堆栈中。第一个地址将是被覆盖的返回地址,接下来的值将是小工具的地址。在有效负载的某些地方,您会看到SH和NULL。这是因为之前的 gadget 将堆栈中的某个值加载到寄存器中,因此该值也应放入堆栈中。的SH是一个地址指向该sh字符串,而NULL是一个地址指向一个0在存储器中的值。
因此,整个 ROP 链只是初始化寄存器以执行系统调用。
XOREAX -> clears EAX
POPEBX, SH -> moves 'sh' string to EBX
POPECX, NULL -> moves a pointer to a NULL value to ECX
POPEDX, NULL -> moves a pointer to a NULL value to EDX
ADDEAX3, ADDEAX3, ADDEAX3, ADDEAX2 -> set EAX to 11
SYSCALL -> perform syscall instruction