栈溢出漏洞利用之ret2txt&ret2shellcode

IoT 4周前 admin
26 0 0

点击蓝字 关注我们

栈溢出漏洞利用之ret2txt&ret2shellcode

栈利用漏洞溢出之

ret2txt&ret2shellcode

栈溢出漏洞利用之ret2txt&ret2shellcode



栈溢出漏洞利用之ret2txt&ret2shellcode

栈溢出介绍


栈溢出漏洞利用之ret2txt&ret2shellcode



栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变, 常见的是覆盖栈中返回地址,改变程序的执行流程。




栈溢出漏洞利用之ret2txt&ret2shellcode

栈保护机制介绍


栈溢出漏洞利用之ret2txt&ret2shellcode



1)canary(也称栈cookie)

原理:在栈帧中插入一个随机数,称为”canary”  。在函数执行完毕返回之前,程序会检查这个随机数是否改变。如果改变,说明栈帧可能被溢出攻击破坏,程序将终止执行。

优点:可以在攻击发生前检测到异常

缺点:如果攻击者能够同时破坏栈上的随机数和返回地址,那么这种保护机制可能会失效。(此外,为了实现栈保护,程序需要进行额外的检查操作,这可能会导致一定的性能开销。)

 

2)栈随机化(Stack Randomization)

栈随机化是一种防御性措施,旨在增加攻击者猜测栈地址的难度。通过在每次启动进程时随机选择栈的基地址,攻击者难以准确预测栈的位置,从而降低了栈溢出等攻击的成功率。

 

3)栈不可执行(Stack No-Execution)

这个机制阻止了栈上的数据被当作指令执行。现代处理器提供了硬件支持,可以将栈上的内存标记为不可执行,从而防止攻击者在栈上注入恶意代码并执行。

 

4)地址空间布局随机化(Address Space Layout Randomization,ASLR)

除了栈,整个进程的地址空间布局也可以进行随机化。ASLR随机地分配可执行文件、共享库、堆和栈等在内存中的位置,使得攻击者难以预测特定代码或数据的位置。

 

5)数据执行保护(Data Execution Prevention,DEP)

DEP防止将数据区域用作可执行代码。它将数据和代码区分开,不允许数据段中的内容被当作指令执行。

 

可以在下图看一下上述几种机制在Linux中的表示:

栈溢出漏洞利用之ret2txt&ret2shellcode

在实际应用中,栈保护机制通常是与其它安全措施结合使用的。例如,可以将重要的数据和代码段存储在受保护的内存区域,以防止攻击者访问或篡改。同时,也可以使用输入验证、异常处理等技术来增强程序的健壮性和安全性。




栈溢出漏洞利用之ret2txt&ret2shellcode

Ret2txt


栈溢出漏洞利用之ret2txt&ret2shellcode



Ret2txt是一种比较简单的栈溢出利用方式,通过栈溢出执行程序中已有的代码,如:程序中写有system等系统调用函数,我们就可以利用控制已有的gadgets,控制system函数。其实就是控制程序执行程序本身已有的代码,使EIP指向具有system(“/bin/sh”)的代码段。

漏洞源代码:

栈溢出漏洞利用之ret2txt&ret2shellcode

检索system地址:

栈溢出漏洞利用之ret2txt&ret2shellcode

计算offset:

栈溢出漏洞利用之ret2txt&ret2shellcode

构造exp:

栈溢出漏洞利用之ret2txt&ret2shellcode
栈溢出漏洞利用之ret2txt&ret2shellcode



栈溢出漏洞利用之ret2txt&ret2shellcode

Ret2shellcode


栈溢出漏洞利用之ret2txt&ret2shellcode




在栈溢出的攻击技术中通常是要控制函数的返回地址到自己想要的地方执行自己想要执行的代码。ret2shellcode是指攻击者需要将调用shell的机器码(也称shellcode)注入至内存中,随后利用栈溢出复写返回地址,进而使程序跳转至shellcode所在内存。

要实现上述目的,就必须在内存中找到一个可写(这允许我们注入shellcode)且可执行(这允许我们执行shellcode)的段,并且需要知道如何修改这些段的内容。

漏洞程序反编译如下图:

栈溢出漏洞利用之ret2txt&ret2shellcode

gets函数在接收用户输入时未对用户输入内容的大小进行限制,存在溢出漏洞,并可以将shellcode复制到buf2中。

查看buf2所在段地址:

栈溢出漏洞利用之ret2txt&ret2shellcode

buf2所在段具有X可执行权限,那么就意味着我们可以将shellcode通过strncpy函数放进buf2这个区域,在触发溢出后将返回地址指向buf2这里即可拿到shell。

栈溢出漏洞利用之ret2txt&ret2shellcode

这里需要注意的是,在进行ret2shellcode利用的时候,shellcode所在的段必须有X可执行权限,否则无法完成利用!

检查保护checksec,未开启NX保护:

栈溢出漏洞利用之ret2txt&ret2shellcode

接下来就是确定返回地址的偏移量了,也就是寻找多少字节能溢出并且刚好能够覆盖返回地址。

cyclic 200 输入200个随机字符使程序崩溃,提示0x62616164这个地址无效。

栈溢出漏洞利用之ret2txt&ret2shellcode

通过 cyclic -l 0x62616164 确定这个的偏移量,在我们输入的数据中的位置

栈溢出漏洞利用之ret2txt&ret2shellcode

可以看到,我们要覆盖的返回地址的偏移量相对于栈顶为 112 个字节。我们最终控制其指向 buf2 就可以执行我们自己的 shellcode 了

exp:

栈溢出漏洞利用之ret2txt&ret2shellcode



【END】




往期精彩合集



● 保护你的信息安全:代码安全的重要性

● 如何绕过APP数据包完整性校验

● CISCO NGFW RAVPN安全配置

● 为NVDIA_ChatWithRTX构建中文LLM

● AIGC产品内容安全测试浅析

● 浅析常见加密算法

● Android LocalSocket 安全风险探讨

● 企业漏洞管理实践分享

● 从OS到BIOS SMM

● A Day in the Life of a Cyber Threat Analyst 网络威胁分析员的一天


联想GIC全球安全实验室(中国)

[email protected]


栈溢出漏洞利用之ret2txt&ret2shellcode


原文始发于微信公众号(联想全球安全实验室):栈溢出漏洞利用之ret2txt&ret2shellcode

版权声明:admin 发表于 2024年4月3日 下午4:05。
转载请注明:栈溢出漏洞利用之ret2txt&ret2shellcode | CTF导航

相关文章