2020网鼎杯朱雀组云顿WP(入门向)

@[TOC](2020网鼎杯朱雀组 云盾(yundun) wp 入门向)

学习PWN也有两年左右时间了,一看就会,一做就废。这次网鼎杯朱雀组结束后拿到一道pwn的题目yundun,尝试自己做了一下,在几个小时内做出来了,虽然没有正式参赛,但是也算是自己做出来的第一道大赛题目,值得纪念一下。后来才发现有更简单的方法(使用格式化字符串漏洞直接利用),但是不影响技术微微 提升。废话不多说,直接进入主题。

二进制分析

题目只给了一个二进制pwn,没有glibc,估计一会儿需要自行确定glibc版本。用checksec查看,保护全开。checksec
拖到IDA,f5大法分析一下,发现是一个简易shell,支持vim、cd、rm、ls、cat操作。其中,vim、rm和cat其实就是对2个堆区(以下称堆1、堆2)进行malloc、free和puts\printf操作。经过一番(许久)观察之后,发现cat堆2的时候存在格式化字符串溢出漏洞,vim堆2的时候会越界写,这个之后再说。先看格式化字符串:格式化字符串漏洞
虽然在printf之前,对buf2也就是堆2的内容进行了简单的格式化字符串利用检测,但是这并不影响我们利用,毕竟谁会直接用%n,%h,%x来进行利用呢。拖到gdb里面下好断点(可以自行百度如何关闭ubuntu的地址随机化),输入

vim 2
aaaaaa
cat 2

看一下在printf处的栈空间,发现在第0x1c处,存着 __libc_csu_init 的地址,由此可以leak出main函数的地址,在第0x1d处,存着 __libc_start_main+240 的地址,在https://libc.blukat.me/上面查一下,满足__libc_start_main地址要求的就一个glibc版本:2.23,因此glibc的版本也确定了。
leak地址
python代码如下:

#leak main addr
io.recvuntil('> ')
myEdit(2, '%34$p')
result = myCat(2)
result = result[2:].strip()
main_addr = int(result, 16) - 0x578
print 'main_addr: ' + hex(main_addr)
myRm(2)

#leak libc addr
myEdit(2, '%35$p')
result = myCat(2)
result = result[2:].strip()
libc_start_main = int(result, 16) - 240
libc_base = libc_start_main - libc.symbols['__libc_start_main']
print 'libc_addr: &
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值