Pwn-Ciscn_2019_Final

Ciscn_2019_Final

感觉是一道很好的堆题,使用了很多技巧以及做题思路,包括了uaf,_IO_2_1_stdin,double_free,还有 _IO_2_1_stdin_fileno,这些技巧。

IDA分析:

main函数:

在这里插入图片描述

init函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k3bKsxbe-1646986999855)(F:\MarkDownS\HEAP\Ciscn_2019_Final\image-20220311140401071.png)]

沙箱:(少截取一点为无所谓)

[(F:\MarkDownS\HEAP\Ciscn_2019_Final\image-20220311140421942.png)]

allocate函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YDO8iIjw-1646986999857)(F:\MarkDownS\HEAP\Ciscn_2019_Final\Ciscn_2019_Final\image-20220311141153638.png)]

这里面每次无论add了int还是short int 都会把bool修改成1。

delete函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D1CXIRnS-1646986999857)(F:\MarkDownS\HEAP\Ciscn_2019_Final\Ciscn_2019_Final\image-20220311141223199.png)]

​ del有一段特殊判定,就是bool的判定,因为bool的存在,导致了没有办法连续释放int或者short int。但是,却可以add1之后再free2,也就是说如果在free2之前先add1就嫩做到连续free了。

还有一点,就是free的对象是针对于int_pt和short_pt的,而且不会清除这两个参数,所以说,就能做到double_free了。

show函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aHNNmdVA-1646986999858)(F:\MarkDownS\HEAP\Ciscn_2019_Final\Ciscn_2019_Final\image-20220311141600211.png)]

​ 这里同样有漏洞,也就是printf的时候能直接把free掉的heap打印出来,所以泄露就是可以用show

bye_bye:

思路分析:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gatDO8nD-1646986999859)(F:\MarkDownS\HEAP\Ciscn_2019_Final\Ciscn_2019_Final\image-20220311145824628.png)]

​ 保护全开,有点痛苦

​ 首先来分析init()函数,一般来说,init函数是没有什么重要的东西的,但是在这个函数中,有一个奇怪的初始化,先打开本地的flag文件,如果没有,就报错退出。然后就是这个DUP2函数,dup函数就是把flag的文件描述符修改为了666,还有一个新的知识点,__fileno,是用来规定fd指向的文件流的,也就是说,如果把__fileno的数据值改为了666,就可以在读入的时候把flag输入进去,然后就可以输出flag了。

​ 为什么要用这种方式来得到flag呢?主要是因为SANDBOX的启用,sandbox就是沙箱,它规定了那些函数是白名单,那些函数是黑名单,一旦调用了黑名单之中的函数,就会退出。使用seccomp-tools可以查看
在这里插入图片描述

​ 可以看到,execve被直接禁用,所以没有办法得到/bin/sh,所以没法使用system("/bin/sh"),所以只能使用修改__io_才能得到flag。所以这道题的最终目的就已经知道了,就是修改fileno为666

​ 首先,对于2.27的程序来说,一般的泄露有两种,一种是在7个tcahe_bin之后进入应该进入的chunk,按道理使用的是unsorted_bin,这样就能泄露出main_arena的位置以及libc的基地址,另一种就是使用large_bin(我并不会)。所以只能尝试unsorted_bin来搞。但是有一个问题,在提供的alloc中,malloc的时候只会给0x20和0x30的大小,如何修改一下这些东西,只能靠漏洞去修改,就想到了uaf。用了uaf之后就可以show(),然后得到自己的地址,找到自己的地址之后计算偏移,就可以找到希望修改的地址的值。

##################################################################################
#泄露
add_1(0x10)
free_1()
add_2(0x10)
add_2(0x10)
add_2(0x10)
add_2(0x10)
free_2()
add_1(0x10)
free_2()
show(2)
p.recvuntil('your short type inode number :')
addr = int
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值