题目来源:Jarvis OJ
题目名称:Level0
题目介绍:
属于栈溢出中的ret2text 意思是Return to text 当程序中有可利用的危险函数 控制程序的返回地址到原本的函数 实现溢出利用
基础过程(看个人习惯):
运行程序 查看程序流程
file 查看文件内存类型
checksec 查看文件保护机制
ida 反编译程序
分析可疑漏洞点 确定攻击思路 编写poc
查看程序运行流程
不同的系统,内存的构造不同,堆栈相关的寄存器操作主要是EBP和ESP寄存器,比作指针来说,ESP寄存器总是指向堆栈的栈顶,当执行PUSH命令向堆栈压入数据的时候,ESP减4,然后把数据拷贝到ESP指向的位置,执行POP命令的时候,首先把ESP指向的数据拷贝到内存/寄存器中,然后ESP+4,而堆栈在内存中的地址从高向低扩展,因此参数或者局部的变量总是通过EBP加减一定的偏移地址来访问的。
32位 4偏移量
64位 8偏移量
栈溢出漏洞,通常需要确定填充长度,计算要操作的地址和覆盖地址的距离,栈基和栈顶的位置,通过上述的偏移量计算获得,根据现实情况去覆盖特定的变量或者地址内容。
得知是64位文件
查看文件保护机制
NX堆栈禁止执行
PIE位置无关可执行文件
Canary堆栈溢出哨兵
Symbol符号
RELRO(got写保护)全局偏移表动态解析函数 地址随机化
只开启了一个NX,没有开启Stack Canary,这个功能在函数执行前先在函数调用位置插入cookie标记,当函数返回调用的时候验证cookie信息是否合法,不合法就停止程序运行,但是如果溢出中,也覆盖了cookie,就会绕过。PIE意为地址无关的可执行文件,每次加载程序的时候都变换text、 data、bss 等段的加载基地址,使得攻击者难以定位相应的基地址执行溢出。
扔到ida看一下 直接进入min函数反汇编 发现会打印helloword后返回了一个函数
查看这个函数 rbp-80h //该字符串距离ebp的长度为 0x80h
ebp
基址指针寄存器 指向系统栈最上面一个栈帧的底部(堆栈寻址)
主要作用是保存恢复堆栈 以便于传递参数给函数
read函数没有做过滤,会读取其中的内容直到回车。
该文件是64位的 距离ebp的长度为0x80 距离esp那就有0x8b
64位的情况下为8byte
pop ebp;出栈 栈扩大4byte
push ebp;出栈,栈减少4byte
那么相应的栈结构为(图是网上偷的)
发现这里有一个callsystem 内置系统函数system(‘/bin/sh’)执行系统命令
地址0x400684 加上这个地址覆盖为我们想要返回读取的地址
payload = ‘a’*0x80 + ‘b’*8 + p64(0x400596)
此时的栈结构是
在把这一串字符串发送到程序内 计算机的内存中每个值都是按照字节存储的 一般情况下都是小端存储
什么是小端存储:
在小端存储模式下 数据的最低有效字节会被存储在数据的最低地址处,最高有效字节反之。
既0x0804843B 在内存中的形式是 x3bx84x04x08
使用pwntools把字节作为字符传递进去,也就是把字符串转换为二进制。
from pwn import * import pwn r = pwn.remote('pwn2.jarvisoj.com', 9881) # buf rbp callsystem payload = 'a'*0x80 + 'b'*8 + p64(0x400596) r.sendline(payload) r.interactive()
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容