主要从第四题开始有新知识点
世界上最棒的程序员
打开ida就能看到flag
ez_XOR
简单的异或,静态能看到异或的是9
enbase64
base64变表,变表代码CV过来就能用
snake
附件下载下来是个pyc文件,直接用uncomplyed6发现出不来,提示magic nuber错误。之后上网查一下各版本python的magic number试就试出来可以uncomplyed6反编译了
进入.py一眼就能看到flag
For Aiur
又是一个python逆向,先用pyinstxtractor反编译出.pyc,发现uncomplyed6出不来,我就去了https://tool.lu/pyc/在线反编译工具反编译出来了。
观察代码发现有个ch库引入了check函数,再看眼函数整体可以发现
只有这一个地方使用了check(),其他代码也都很正常,那么关键就在这个check函数了。
回到pyinstxtractor反编译出来的文件夹,搜索ch可以找到ch.pyc
使用uncomplyed6即可得到ch.py,打开直接就能看到加密很简单的flag
程序和人有一个能跑就行了
拖进ida简单分析一下,可以发现一个很明显的RC4加密函数
Buf1是RC4加密结果,写脚本嗦一下就可以轻松得到flag,不过是fake的
res_l = [0x8D, 0x6C, 0x85, 0x76, 0x32, 0x72, 0xB7, 0x40, 0x88, 0x7E, 0x95, 0xEE, 0xC5, 0xED, 0x2E, 0x71, 0x37, 0xF1, 0x4A, 0x99, 0x35, 0x18, 0xA7, 0xB0, 0x00, 0x96, 0xB7]
res_b = bytes(res_l)
seed = b"litctf"
enc = ARC4.new(seed)
inp = enc.decrypt(res_b)
print(inp)
然后接着分析代码。运行过几次之后发现输入错误只会显示wrong?输入正确只会显示right?,与ida的代码逻辑不相符
这里不是if else,而是只有if,那么逻辑上讲right是一定会输出的,但事实没有。那么if分支中就有些异样了。换成汇编进入动态分析
发现走过了sub_475190却依旧在执行一些ida没有反编译出来的代码。继续往下执行可以看到
把这段16进制放入脚本执行RC4解密,就可以得到flag了
from Crypto.Cipher import ARC4
res_l = [0x8D, 0x6C, 0x85, 0x76, 0x32, 0x72, 0xB7, 0x43, 0x85, 0x7B, 0x85, 0xDE, 0xC1, 0xFB, 0x2E, 0x64, 0x07, 0xC8, 0x5F, 0x9A, 0x35, 0x18, 0xAD, 0xB5, 0x15, 0x92, 0xBE, 0x1B, 0x88]
res_b = bytes(res_l)
seed = b"litctf"
enc = ARC4.new(seed)
inp = enc.decrypt(res_b)
print(inp)
问了下可能是C++异常处理的知识点
debase64
拖进ida先静态分析,能看到输入20个字符到v15,在sub_401520函数将v15转换到了v4,再拿v4和v6-v14的每个字节进行比较。根据题目和进入sub_401520也可以基本确定sub_401520是个解base64的函数。
之后进入动态调试,步过sub_401520的时候发现这不是普通的base64。动态分析后能发现,原理是把base64解密顺序反过来了,用第四个字符左移两位,第三个字符右移四位这样。故只需写个加密脚本,手动把顺序倒过来就好。因为flag后有3个“=”,最后一位根据hint爆破即可。
import base64
list = [0x46, 0xED, 0x18, 0x96, 0x56, 0x9E, 0xD2, 0x72, 0xB2, 0xB3, 0x80, 0x70, 0xFF]
list_b = bytes(list)
print(base64.b64encode(list_b))
Ru0Yllae0nKys4Bw/w== –>> Y0uReallyKn0wB4s/w== –>> Y0uReallyKn0wB4s?===
import hashlib
key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
for i in key:
str1 = "Y0uReallyKn0wB4s" + i + "==="
if hashlib.md5(str1.encode('utf-8')).hexdigest() == "5a3ebb487ad0046e52db00570339aace":
print(str1)
break
得到Y0uReallyKn0wB4s3===