"strange" 如何在普通 DLL 中找到 ROP 小工具?编译器永远不会这样做。 (Return面向编程)

How can "strange" ROP gadgets be found in a normal DLL? Compilers would never do this. (Return-oriented programming)

小工具:

pushad
ret

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

假设DLL是合法的,怎么可能自动搜索到gadget?使用它的函数示例可能会有所帮助。

指令编码为:

60  pushad
c3  ret

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

66 0f 60 c3  punpcklbw xmm0, xmm3

看到里面的60 c3小工具了吗?或者,该小工具可以直接从某个地方获取。例如,假设在 0x4800c360 处有一些变量,我们尝试加载它的地址:

b8 60 c3 00 48  mov eax, 0x4800c360

又看到小工具了?

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