无法理解这个 rop 链

逆向工程 部件 缓冲区溢出
2021-06-12 12:58:09

我最近看到一个视频,有人在做一些 rop 工作。我对正在发生的事情有很多麻烦。他的设置是这样的:

[garbage]
[xor eax]
[xor ebx]
[address of "sh"]
[pop ecx]
[address of Null byte]
[pop edx]
[address of Null byte]
[add eax 11]

第一条指令是xor eax(where eipreturn is) ,esp当有 pop 指令时我不明白它在哪里

视频链接:https : //youtu.be/uYHOxlYzH0A

1个回答

ROP 链使用小工具,它们是执行基本功能的短代码片段。您在视频中的 Python 脚本中看到的说明是小工具名称,这些名称是在开始时选择的。
例如,该XOREAX小工具是位于 address 的代码片段0x080512c0,其中包含以下说明:

xor eax, eax
ret

因此,当XOREAX小工具被调用时,eax寄存器被清除并ret执行一条指令。因为ret从堆栈中加载一个地址并跳转到该地址,因此该指令用于调用下一个小工具。

您在 Python 脚本中看到的是有效载荷的构造,它将被放入堆栈中。第一个地址将是被覆盖的返回地址,接下来的值将是小工具的地址。在有效负载的某些地方,您会看到SHNULL这是因为之前的 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