首页
论坛
课程
招聘
[原创]无脑暴力爆破 第二题 南冥神功
2021-5-12 18:46 2489

[原创]无脑暴力爆破 第二题 南冥神功

2021-5-12 18:46
2489

首先还是需要看懂本题,本题就是走出迷宫,根据判断条件需要将所有的校验表里的0全部换为1,并且每个输入可以修改两个位置(走两步)

1

2

3

4

5

6

7

8

9

0x530x000x010x000x000x010x000x000x010x01,

0x010x010x000x000x010x000x000x010x000x00,

0x000x000x010x000x010x010x010x010x010x00,

0x000x010x010x000x010x000x000x010x000x00,

0x000x000x010x000x000x010x000x000x010x01,

0x010x010x000x010x010x010x000x010x000x01,

0x000x000x010x010x010x010x000x010x000x01,

0x000x010x010x000x000x010x000x010x000x01,

0x000x000x000x010x000x000x010x010x000x00


但该题似乎存在一个bug,可以一个一个字符去验证,只有当输入的都为有效值时才会进入本题的校验部分,假设第一次输入为"G",存在2次有效修改则会进入校验部分。再次输入"G0"时,因为0没有存在两次有效修改,所以不会进入校验部分。所以关键点来了,我们可以在程序的跳入校验的部分进行修改(本次案例中我将其跳转到输出"Good Job"部分作为提示,并且修改后程序为“a.exe”),通过对修改后的程序使用进程通信进行爆破。

由于每个有效输入可以修改两个位置,通过计算迷宫中存在多少个'0',将其个数 / 2,则可以得到flag的长度为23,整个暴力脚本如下。

from multiprocessing import Pipe, process
import os
import sys
import subprocess

table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
key = "S01001001111001001000010111110011010010000100100111101110101001111010101100101010001001100"
flag_len = int(key.count('0') / 2)

def brute(flag):
    for ch in table:
        tmpflag = flag + ch
        process = subprocess.Popen('F:\\ctf\\KCTF2021Q2\\2\\a.exe', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE) #F:\\ctf\\KCTF2021Q2\\2\\a.exe
        inputdata = tmpflag + "\r\n"

        process.stdin.write(inputdata.encode('utf-8'))
        outputdata = process.communicate()[0]
        process.kill()

        if b"Good job" in outputdata:
            if len(tmpflag) == flag_len:
                print("[+] Found flag: " + tmpflag)
            brute(tmpflag)
    return

def main():
    brute("")
    return


if __name__ == '__main__':
    main()


最后flag为GJ0V4LA4VKEVQZSVCNGJ00N


[注意] 欢迎加入看雪团队!base上海,招聘安全工程师、逆向工程师多个坑位等你投递!

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回