点击蓝字 关注我们
栈利用漏洞溢出之
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
Ret2txt是一种比较简单的栈溢出利用方式,通过栈溢出执行程序中已有的代码,如:程序中写有system等系统调用函数,我们就可以利用控制已有的gadgets,控制system函数。其实就是控制程序执行程序本身已有的代码,使EIP指向具有system(“/bin/sh”)的代码段。
漏洞源代码:
检索system地址:
计算offset:
构造exp:
Ret2shellcode
在栈溢出的攻击技术中通常是要控制函数的返回地址到自己想要的地方执行自己想要执行的代码。ret2shellcode是指攻击者需要将调用shell的机器码(也称shellcode)注入至内存中,随后利用栈溢出复写返回地址,进而使程序跳转至shellcode所在内存。
要实现上述目的,就必须在内存中找到一个可写(这允许我们注入shellcode)且可执行(这允许我们执行shellcode)的段,并且需要知道如何修改这些段的内容。
漏洞程序反编译如下图:
gets函数在接收用户输入时未对用户输入内容的大小进行限制,存在溢出漏洞,并可以将shellcode复制到buf2中。
查看buf2所在段地址:
buf2所在段具有X可执行权限,那么就意味着我们可以将shellcode通过strncpy函数放进buf2这个区域,在触发溢出后将返回地址指向buf2这里即可拿到shell。
这里需要注意的是,在进行ret2shellcode利用的时候,shellcode所在的段必须有X可执行权限,否则无法完成利用!
检查保护checksec,未开启NX保护:
接下来就是确定返回地址的偏移量了,也就是寻找多少字节能溢出并且刚好能够覆盖返回地址。
cyclic 200 输入200个随机字符使程序崩溃,提示0x62616164这个地址无效。
通过 cyclic -l 0x62616164 确定这个的偏移量,在我们输入的数据中的位置
可以看到,我们要覆盖的返回地址的偏移量相对于栈顶为 112 个字节。我们最终控制其指向 buf2 就可以执行我们自己的 shellcode 了
exp:
【END】
往期精彩合集
● 浅析常见加密算法
长
按
关
注
联想GIC全球安全实验室(中国)
原文始发于微信公众号(联想全球安全实验室):栈溢出漏洞利用之ret2txt&ret2shellcode