如何在普通 DLL 中找到“奇怪”的 ROP 小工具?编译器永远不会这样做。(面向返回的编程)

Roe*_*ous 3 dll x86 assembly reverse-engineering machine-code

小工具:

pushad
ret
Run Code Online (Sandbox Code Playgroud)

在合法程序中,来自某个 DLL 对我来说毫无意义。

假设 DLL 是合法的,如何通过自动搜索找到小工具?使用函数的示例可能会有所帮助。

fuz*_*fuz 5

指令编码为:

60  pushad
c3  ret
Run Code Online (Sandbox Code Playgroud)

因此,无论这两个字节出现在哪里,都会pushad; ret获得一个小工具。例如,这条指令可以合理地存在于 SSE 代码中:

66 0f 60 c3  punpcklbw xmm0, xmm3
Run Code Online (Sandbox Code Playgroud)

看到里面的60 c3小工具了吗?或者,小工具可以从一些即时获得。例如,假设有一个变量 at0x4800c360并且我们尝试加载它的地址:

b8 60 c3 00 48  mov eax, 0x4800c360
Run Code Online (Sandbox Code Playgroud)

再次看到小工具?

这个小工具还有很多其他方式可以出现在完全正常的代码中。

  • 或者甚至只是像“add eax, 0x60;”之类的东西 ret` 例如来自 `return foo+96;` (2认同)