栈溢出总结+ret2text

本文深入探讨了栈溢出的原理,强调了栈中保存的函数返回地址的重要性。通过篡改这个地址,可以实现代码执行的跳转。文章还介绍了函数调用栈的结构和主要过程,并简要提及了保护方式及如何绕过这些保护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、堆栈溢出原理

通俗的讲,栈溢出的原理就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了老的堆栈数据。

其中,最重要的一点: 栈中保存了函数调用时的返回地址。
缓冲区溢出的目的就是要将栈中保存的返回地址篡改成溢出的数据,这样就间接修改了函数的返回地址,当函数返回时,就能跳转到预设的地址中,执行植入的代码。

2、函数调用栈的结构和主要过程
图示:
在这里插入图片描述
文字说明:
调用及释放
汇编代码

push 参数 3               #参数由右向左入栈
push 参数 2
push 参数 1
call 函数地址             #push当前指令位置,跳转到所调用函数的入口地址
push ebp                 #保存旧栈帧的底部
mov ebp,esp              #设置新栈帧底部
sub esp ,xxx             #设置新栈帧顶部

栈帧调整:
保存当前栈帧的状态值,为了后面恢复本栈帧时使用(EBP入栈);
将当前的栈帧切换到新栈帧(ESP值装入EBP,更新栈帧底部);
给新栈帧分配空间(ESP减去所需要空间的大小,抬高栈顶)。

3、保护方式及其绕过方法:

保护 绕过
数据执行保护(NX/DEP) ROP
### ret2text 漏洞利用技术原理 ret2text 是一种常见的返回导向编程(Return-Oriented Programming, ROP)攻击手段之一。在这种攻击中,攻击者通过控制程序的执行流程来跳转至程序本身已有的代码片段——即位于 `.text` 段内的指令序列,这些指令通常以 `ret` 结束[^1]。 .text 段包含了编译后的二进制文件中的可执行机器码部分,比如函数定义和其他静态初始化的数据结构。由于该区域的内容是在加载时被映射为只读属性,因此无法直接修改其内容;然而,如果存在某种机制允许改变 CPU 的指令指针寄存器 EIP/RIP,则可以通过精心构建堆栈帧的方式使处理器转向 .text 中预选的位置继续运行[^2]。 当发生缓冲区溢出错误时,可能会覆盖掉存储于栈上的返回地址,这正是 ret2text 攻击所依赖的关键点所在。一旦成功篡改了这个值,就可以引导程序去调用那些原本不会被执行到的地方,进而达到绕过安全防护措施的目的,如获取敏感信息或执行任意命令等操作[^3]。 为了定位合适的 gadget 并精确计算偏移量,在实际应用过程中经常会借助工具生成循环模式串 (cyclic pattern),以此快速确定目标位置相对于起始处的距离关系。这种方法不仅提高了效率而且减少了手动调试的工作量[^4]。 #### 实现方法示例 假设有一个简单的 C 程序存在栈溢出缺陷: ```c #include <stdio.h> void vulnerable_function(char *str){ char buffer[64]; strcpy(buffer,str); } int main(int argc,char **argv){ if(argc>1)vulnerable_function(argv[1]); return 0; } ``` 要对该应用程序发起 ret2text 攻击,具体步骤如下所示: 1. 使用 GDB 或其他调试工具分析二进制文件找到可用的小工具链(gadgets chain); 2. 利用 cyclic pattern 工具创建唯一字符组成的字符串作为输入数据的一部分; 3. 将此特殊构造好的 payload 发送给易受攻击的服务端口; 4. 当触发异常后再次使用相同工具反向查找崩溃时刻 ESP 寄存器指向的确切字节索引; 5. 替换相应位数的随机填充物为真实的目标地址,确保最终形成的完整载荷能够顺利转移控制权给选定的一系列 gadgets 执行预期动作。 ```bash # 创建一个长度足够的pattern用于测试 $ python -c 'import sys;print("Aa"*8+"Bb"*7)' | ./vuln_program ... # 假设发现程序在接收到上述payload之后崩溃,并且EIP被设置成了"Bb" # 那么我们就能知道从buffer开头算起到return address之间的距离大约是多少个字节 $ python -c 'from pwn import *; print(cyclic_find(0x6262))' # 输出结果表示offset大小 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值