Bootstrap

REVERSE-PRACTICE-CTFSHOW-3

REVERSE-PRACTICE-CTFSHOW-3

签退

.pyc文件,uncompyle6反编译,得到python源码,分析写在源码注释中
先变表base64,再凯撒加密,向后移动2位

import string
c_charset = string.ascii_uppercase + string.ascii_lowercase + string.digits + '()'
flag = 'BozjB3vlZ3ThBn9bZ2jhOH93ZaH9'
#encode为变表base64 table为c_charset
def encode(origin_bytes):
    c_bytes = [ ('{:0>8}').format(str(bin(b)).replace('0b', '')) for b in origin_bytes ]
    resp = ''
    nums = len(c_bytes) // 3
    remain = len(c_bytes) % 3
    integral_part = c_bytes[0:3 * nums]
    while integral_part:
        tmp_unit = ('').join(integral_part[0:3])
        tmp_unit = [ int(tmp_unit[x:x + 6], 2) for x in [0, 6, 12, 18] ]
        resp += ('').join([ c_charset[i] for i in tmp_unit ])
        integral_part = integral_part[3:]

    if remain:
        remain_part = ('').join(c_bytes[3 * nums:]) + (3 - remain) * '0' * 8
        tmp_unit = [ int(remain_part[x:x + 6], 2) for x in [0, 6, 12, 18] ][:remain + 1]
        resp += ('').join([ c_charset[i] for i in tmp_unit ]) + (3 - remain) * '.'
    return rend(resp)

#rend为凯撒加密,字母向后移动2位,数字不变
def rend(s):

    def encodeCh(ch):
        f = lambda x: chr((ord(ch) - x + 2) % 26 + x)
        if ch.islower():
            return f(97)
        if ch.isupper():
            return f(65)
        return ch

    return ('').join(encodeCh(c) for c in s)

用工具CTFCrackToolsKt-3.2.4.jar得到凯撒加密前的字符串
qiantui-caesar
再用工具加密解密小玩具解base64,即可得到flag
qiantui-flag

神光

exe程序,运行后输入key,ida分析
main函数,获取输入后check
shenguang-main
跟进check,简单的将输入和明文字符串"wangzherongyao"比较
shenguang-check
运行exe,输入"wangzherongyao",打印出一段不明意义的中文字符
shenguang-fakeflag
继续向下走,在弹窗MessageBoxA后,sub_4113CF->sub_415770
input已知是"wangzherongyao",两段运算,然后打印
shenguang-operate
调试一下,如图所示,在call ds:MessageBoxA指令处下断点,因为程序有反调试,执行这条指令时会直接退出
执行流断在这里后,在ida中选中lea eax, [ebp+input]这条指令,右键->Set IP,将该指令设置为下一跳即将执行的指令,即可绕过反调试
shenguang-bks
绕过反调试后,在打印完成返回的地方下断点,F9运行到此处,在黑窗即可看到flag
shenguang-flag

签到

elf文件,ida分析
main函数,重点是第49行,输入与下标以及已知的v9数组进行运算
最后要求v6==0,由异或运算的特性可知,input=index ^ (index + (index ^ v9[index]))
qiandao-main
取出v9元素,写脚本即可得到flag

v9=[102,109,99,98,127,58,85,106,57,82,122,55,81,19,51,35,67,
    70,41,61,41,32,127,28,38,77,49,20,80,94,-24]
flag=""
for i in range(len(v9)):
    flag+=chr(i^(i+(i^v9[i])))
print(flag)
#flag{A_s1mpLe&E4sy_RE_i5Nt_1t}

baby_gay

elf文件,ida分析
main函数,verifyPwd函数验证输入是否为"ZGFuaXU=",验证成功后会打印另一段字符串
baby-main
然后就没有其他逻辑了,看了网上其他师傅的wp,说是解RC4,不过没看出来要解,比较迷惑
baby-flag

;