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

Posted

技术标签:

【中文标题】如何在正常的 DLL 中找到“奇怪的”ROP 小工具?编译器永远不会这样做。 (面向回报的编程)【英文标题】:How can "strange" ROP gadgets be found in a normal DLL? Compilers would never do this. (Return-oriented programming) 【发布时间】:2020-05-04 15:39:45 【问题描述】:

小工具:

pushad
ret

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

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

【问题讨论】:

【参考方案1】:

指令编码为:

60  pushad
c3  ret

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

66 0f 60 c3  punpcklbw xmm0, xmm3

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

b8 60 c3 00 48  mov eax, 0x4800c360

又看到小工具了吗?

这个小工具可以通过很多其他方式以完全正常的代码出现。

【讨论】:

或者甚至像add eax, 0x60; ret这样的东西来自return foo+96;

以上是关于如何在正常的 DLL 中找到“奇怪的”ROP 小工具?编译器永远不会这样做。 (面向回报的编程)的主要内容,如果未能解决你的问题,请参考以下文章

MS C++ 2010 和 mspdb100.dll

Linux内核ROP姿势详解

从《从小工到专家》的“道”到大厂的“法术器”-哲学篇

从《从小工到专家》的“道”到大厂的“法术器”-哲学篇

从《从小工到专家》的“道”到大厂的“法术器”-哲学篇

从《从小工到专家》的“道”到大厂的“法术器”-哲学篇