网易首页 > 网易号 > 正文 申请入驻

手把手教你如何用 ROP 绕过数据执行保护

0
分享至

DEP(数据执行保护)是一种内存保护功能,允许系统将内存页标记为不可执行。ROP(面向返回的编程)是一种利用技术,允许攻击者在启用DEP等保护的情况下执行shellcode。在这篇文章中,我们将介绍应用程序的逆向过程,以发现缓冲区溢出漏洞,并开发用于绕过DEP的ROP小工具链(Gadget Chain)。

我们将在开发过程中使用以下工具:QuoteDB、TCPView(一个查看端口和线程的小工具,只要木马在内存中运行,一定会打开某个端口,只要黑客进入你的电脑,就有新的线程)、IDA Freeware、WinDbg(在windows平台下,强大的用户态和内核态调试工具)和rp++。

QuoteDB是一个设计上易受攻击的应用程序,创建它是为了实践逆向工程并利用它进行开发。如下图所示,该应用程序正在侦听端口3700上的网络连接:

我们已经使用TCPView确认程序确实在监听端口3700。

现在我们需要对应用程序进行逆向工程,看看它是如何处理网络连接的。accept函数用于允许指定端口上的传入连接,然后进程创建一个运行“handle_connection”例程的新线程,如下所示:

recv函数用于从连接的套接字接收数据:

我们已经开发了一个基本的Python脚本,它创建一个TCP套接字,并在端口3700上向远程服务器发送1000个“a”字符:

我们已将WinDbg附加到QuoteDB.exe进程,并列出了加载的模块,如下图所示。

我们可以使用“bp”命令在recv函数调用后放置断点,使用“bl”命令确认断点已成功设置:

recv函数返回后,EAX寄存器包含以十六进制接收的字节数:

缓冲区的前4个字节表示一个操作码,该操作码被移到EAX寄存器中,然后打印在命令行中:

下图显示了WinDbg中的printf调用,我们可以观察到第三个参数(=Opcode)由4个“A”字符组成:

该进程显示源IP地址、源端口、缓冲区长度和十进制的操作码:

应用程序从Opcode中减去0x384(十进制900),并将结果与4进行比较。这是一个带有5个示例的开关,也显示在下图中。

EAX寄存器大于4,执行流被重定向到默认情况,该情况调用“log_bad_request”函数:

上述函数包含缓冲区溢出漏洞,如下图所示,可执行文件在堆栈上分配0x818(2072)字节,用0初始化缓冲区,并在不检查边界的情况下将有效负载复制到此缓冲区:

发生溢出是因为要复制的字符数(0x4000)大于缓冲区的大小,并且可能会重写返回地址:

我们选择发送3000个“A”字符以利用该漏洞。如下所示,返回地址在堆栈上被重写,程序因此崩溃:

我们使用了“msf-pattern_create”命令来生成一个唯一的模式,该模式将为我们提供偏移量。

应用程序在不同的地址崩溃,该地址用于使用“msf-pattern_offset”命令确定精确的偏移量:

我们修改了概念证明,以包括上述偏移量。在正确的地址崩溃后,ESP寄存器指向我们控制的缓冲区的最后一部分:

我们使用了narly WinDbg扩展来显示加载的模块及其内存保护,下图显示了该可执行文件是在启用ASLR和DEP保护的情况下编译的。

Windows Defender Exploit Guard可以用来启用/禁用ASLR。我们需要进入“Exploit protection settings”,选择“Program settings”页签,点击“Add Program to custom”,选择“Choose exact file path”选项:

我们想通过发送从“\x00”到“\xFF”的所有字节并确定它们如何写入堆栈来找出哪些字符被认为是“不适合”的:

如下图所示,没有不适合的字符,不过为了研究,我们将“\x00”视为不适合字符,因为它通常是不适合字符。正因为如此,漏洞开发过程稍微复杂一些,但它可能更容易适应其他应用程序。

我们使用rp++工具从“SysWOW64\kernel32.dll”模块中提取ROP小工具,因为ASLR是禁用的,所以我们可以选择任何提供必要ROP小工具的DLL,但是,我们将在以后的文章中看到应用程序泄漏特定DLL中的地址。我们已将小工具中的最大指令数设置为5:

由于DEP保护,堆栈不再是可执行的,我们需要找到执行shellcode的方法。我们可以使用VirtualAlloc、VirtualProtect和WriteProcessMemory等API来绕过DEP。VirtualAlloc函数用于保留、提交或更改进程地址空间中页面的状态。该函数有4个参数:

lpAddressdwSizeflAllocationTypeflProtect

我们的目的是将flAllocationType参数设置为0x1000(MEM_COMMIT),将flProtect设置为0x40(PAGE_EXECUTE_READWRITE)。我们需要在堆栈上创建以下框架:

VirtualAlloc addressReturn address (Shellcode address)lpAddress (Shellcode address)dwSize (0x1)flAllocationType (0x1000)flProtect (0x40)

我们为每个元素分配了一个特定的值,需要在运行时使用正确的值对其进行修改。

如下图所示,可以在ESP寄存器的固定偏移处找到框架:

kernel32.dll模块的起始地址可以使用WinDbg来标识。所有ROP小工具的地址必须使用该值而不是“ROP.txt”文件中的加载地址来计算:

首先,我们需要找到一个保存ESP寄存器值的ROP小工具。我们确定了一个将ESP寄存器复制到ESI寄存器的寄存器:

我们修改了Python脚本,以包含kernel32地址和上述ROP小工具偏移量,如下所示:

我们已经成功地将执行流程重定向到我们的第一个ROP小工具,接着将其他ROP小工具链接在一起,因为ESP仍然指向我们的缓冲区:

现在我们需要找到从ESI寄存器中减去0x1C的方法。然而,由于缺少涉及使用ESI寄存器进行计算的ROP小工具,我们找到了一个将ESI寄存器复制到EAX中的ROP小工具。唯一的问题是ESI也被“POP ESI”指令修改,但是,它不会影响我们的利用:

在许多ROP小工具中发现的另一个寄存器是ECX。我们已经确定了一个ROP小工具,它从堆栈中弹出一个值到ECX寄存器中,另一个小工具将EAX和ECX寄存器加在一起。加上负值等于减去相同的正值:

通过在之前的EAX值上添加-0x1C (= ECX)值,EAX指向VirtualAlloc框架:

因为EAX在任何计算中都很有用,所以我们需要在执行任何其他操作之前找到保存它的方法。我们发现了一个ROP小工具,它将EAX寄存器复制到ECX中,ECX将用于修改框架中的值。事实上,EAX也被这个ROP小工具修改了,但这并不影响我们的利用:

我们修改后的概念证明如下图所示。“junk”值对堆栈对齐很有用,对应于“POP reg”和“retn4”指令。

再次运行Python脚本后,我们可以观察到ECX寄存器的值与之前的EAX寄存器相同,并指向VirtualAlloc框架:

IAT(导入地址表)包含指向由其他DLL导出的函数的指针。例如,kernel32.dll在VirtualAlloc的IAT中有一个条目,即使VirtualAlloc实际地址发生变化,该条目也保持不变:

我们使用了“POP EAX”指令将VirtualAlloc IAT复制到EAX寄存器中,需要对其进行解除引用才能获得VirtualAlloc地址,如下所示:

在更新Python脚本并再次运行之后,我们成功地获得了EAX中的VirtualAlloc地址:

因为ECX仍然指向VirtualAlloc框架,所以我们需要一个包含“MOV [ECX], EAX”的ROP小工具,以便使用VirtualAlloc地址更新第一个框架值:

我们需要找到一种方法来修改ECX寄存器以指向下一个框架值。“INC ECX”指令用于将1添加到ECX寄存器,我们已使用了其中的4个:

如下图所示,ECX指向下一个需要修改的元素:

第二个框架值对应于shellcode地址。第一个ROP小工具将ECX寄存器复制到EAX中。我们的想法是将shellcode放在有效载荷中ROP小工具之后,这将代表一个比当前更高的地址。我们已经从EAX寄存器中减去了一个负偏移量(-0x210),现在EAX指向一个可以用我们的shellcode填充的缓冲区:

使用以前的ROP小工具,我们更新了框架中的第二个值,现在看起来如下:

第三个骨架值(lpAddress)也应该等于shellcode地址。类似地,我们从EAX寄存器中减去了一个不同的偏移量(-0x20c),因为EAX增加了4。你可能会注意到,两次执行之间的堆栈地址是不同的,但偏移量保持不变:

第四个框架值(dwSize)应初始化为1,由于我们认为“\x00”是一个不适合字符,我们不能只将所需的值放在堆栈上,因为它包含NULL字节。我们已使用“NEG EAX”指令让-1 = 0xFFFFFFFF 无效,并获得所需值:

第五个框架值(flAllocationType)应设置为0x1000。我们需要找到两个和为0x1000的十六进制数,我们考虑number1=0x88888888。通过简单的数学运算,我们可以确定第二个数字必须是0x77778778,如下所示:

我们使用“POP reg”指令将这两个数字复制到EAX和ESI中,并使用另一个ROP小工具执行添加操作,如下图所示。

我们几乎完成的VirtualAlloc框架如下所示:

最后一个框架值(flProtect)应初始化为0x40。我们已经提供了获得所需结果的必要步骤:

最后,我们需要找到一种使用修改后的参数执行VirtualAlloc函数的方法。指向最后一个框架值的ECX寄存器被复制到EAX寄存器中,EAX寄存器需要减去0x14(框架中的6个元素)才能指向VirtualAlloc框架的第一个值。“xchg”指令用于交换EAX寄存器和ESP寄存器的内容,从而执行VirtualAlloc函数:

ROP小工具链的最后一部分如下所示:

执行VirtualAlloc API后,我们可以看到缓冲区现在是可执行的:

我们可以确定shellcode地址和最后一个ROP小工具之间的距离是0x9C字节。

我们添加了0x9C填充字节,然后添加了一个包含NOP指令的伪shellcode,以确认偏移量是否正确:

我们已经使用msfvenom生成了一个逆向shell,并成功地执行了攻击。通过将多个执行VirtualAlloc调用的ROP小工具链接在一起,并将包含shellcode的内存页作为可执行文件来绕过。

参考及来源:https://cybergeeks.tech/a-step-by-step-introduction-to-the-use-of-rop-gadgets-to-bypass-dep/

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
底层打工人的共鸣反击,满屏幕都是“打得好”,问题还是出现了!

底层打工人的共鸣反击,满屏幕都是“打得好”,问题还是出现了!

走读新生
2024-06-21 00:40:40
总决赛拿1000分太难了!库里差72分,科比35分,詹姆斯差几分第一

总决赛拿1000分太难了!库里差72分,科比35分,詹姆斯差几分第一

刺头体育
2024-06-20 21:35:41
广汽本田裁员名额被抢空,部分员工早已计划跳槽到造车新势力

广汽本田裁员名额被抢空,部分员工早已计划跳槽到造车新势力

界面新闻
2024-06-19 16:37:15
外媒:美国违反合同,要将瑞士订购的“爱国者”导弹移交乌克兰

外媒:美国违反合同,要将瑞士订购的“爱国者”导弹移交乌克兰

环球时报国际
2024-06-20 15:32:15
对中国毫无认同感!38万苗族人挤进美国,背叛与鲜血酿出“恶果”

对中国毫无认同感!38万苗族人挤进美国,背叛与鲜血酿出“恶果”

青栀伊人
2024-06-17 22:11:27
蓝白军团真团结!进球后不庆祝,查看麦卡伤势,拼出美洲杯首球

蓝白军团真团结!进球后不庆祝,查看麦卡伤势,拼出美洲杯首球

奥拜尔
2024-06-21 09:41:29
这届618,抖音颓了,天猫笑了

这届618,抖音颓了,天猫笑了

钛媒体APP
2024-06-20 18:58:32
江西男子被“托梦”告知地下有宝藏,深挖7米后,被眼前一幕震撼

江西男子被“托梦”告知地下有宝藏,深挖7米后,被眼前一幕震撼

青丝人生
2024-01-29 17:59:05
洪金宝:我不在乎钱,如果以我当年的财力,现在可能是半个李嘉诚

洪金宝:我不在乎钱,如果以我当年的财力,现在可能是半个李嘉诚

吾爱纪实
2024-06-20 11:17:38
华晨宇香港演唱会造型曝光,想走林佳树路线,网友热议太“奇葩”

华晨宇香港演唱会造型曝光,想走林佳树路线,网友热议太“奇葩”

娱乐白名单
2024-06-19 10:55:48
论真核的作用!去年德国11场输6场,克罗斯回归后出战5场德国全胜

论真核的作用!去年德国11场输6场,克罗斯回归后出战5场德国全胜

直播吧
2024-06-20 11:52:52
上海市委书记、上海警备区党委第一书记陈吉宁简历

上海市委书记、上海警备区党委第一书记陈吉宁简历

探秘桂北
2024-05-03 00:11:57
“人造数学天才”,一个非常拙劣的谎言,彻头彻尾的炒作

“人造数学天才”,一个非常拙劣的谎言,彻头彻尾的炒作

爆角追踪
2024-06-18 17:25:17
中午,医生来把尿管拔了,我给妈妈清洗了一下。她什么也没问...

中午,医生来把尿管拔了,我给妈妈清洗了一下。她什么也没问...

小刀99
2024-05-11 09:45:09
难以相信!日本的国际形象很差吗?网友:佩服得五体投地!

难以相信!日本的国际形象很差吗?网友:佩服得五体投地!

有趣的羊驼
2024-06-06 14:22:52
巨贪自创快乐日记,震碎所有人的三观

巨贪自创快乐日记,震碎所有人的三观

陈皮吃话梅
2023-10-18 14:10:46
事态升级!南医大拒绝央视采访,该校学生发声:支持老师先救人!

事态升级!南医大拒绝央视采访,该校学生发声:支持老师先救人!

音乐时光的娱乐
2024-06-21 00:36:28
张维迎:瞧!他们说假话不脸红

张维迎:瞧!他们说假话不脸红

我是娱有理
2024-05-01 07:18:24
李莉女士怀抱着无畏的精神,披露国际风云,却不幸陷入网暴漩涡中

李莉女士怀抱着无畏的精神,披露国际风云,却不幸陷入网暴漩涡中

橘色数码
2024-06-06 12:51:20
张路:英格兰好像没有发挥出球员的能力,问题在哪儿也说不太清

张路:英格兰好像没有发挥出球员的能力,问题在哪儿也说不太清

直播吧
2024-06-21 02:05:25
2024-06-21 10:02:44
嘶吼RoarTalk
嘶吼RoarTalk
不一样的互联网安全新视界
7439文章数 10509关注度
往期回顾 全部

科技要闻

美媒:苹果正与百度阿里百川等谈AI合作

头条要闻

媒体:中国外交部刚批评美国 五角大楼就送来"神助攻"

头条要闻

媒体:中国外交部刚批评美国 五角大楼就送来"神助攻"

体育要闻

1-0"吊打"意大利 西班牙这就叫冠军相?

娱乐要闻

叶舒华参加柯震东生日聚会,五毒俱全

财经要闻

普华永道,引火烧身

汽车要闻

售价11.79-14.39万元 新一代哈弗H6正式上市

态度原创

本地
健康
数码
亲子
公开课

本地新闻

2024·合肥印象|用崭新视角对话城市发展

晚餐不吃or吃七分饱,哪种更减肥?

数码要闻

苹果 macOS 14.6 Public Beta 1 公测版更新发布

亲子要闻

你这声丈母家叫的 估计你同学妈妈心都化了 网友:情商智商双在线

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版