LOADING

加载过慢请开启缓存 浏览器默认开启

LitCTF RE方向 WP

2023/6/29

主要从第四题开始有新知识点

世界上最棒的程序员

打开ida就能看到flag

ez_XOR

简单的异或,静态能看到异或的是9

enbase64

base64变表,变表代码CV过来就能用

snake

附件下载下来是个pyc文件,直接用uncomplyed6发现出不来,提示magic nuber错误。之后上网查一下各版本python的magic number试就试出来可以uncomplyed6反编译了

p9cDMTI.png

进入.py一眼就能看到flag

For Aiur

又是一个python逆向,先用pyinstxtractor反编译出.pyc,发现uncomplyed6出不来,我就去了https://tool.lu/pyc/在线反编译工具反编译出来了。

p9cDT1O.png

观察代码发现有个ch库引入了check函数,再看眼函数整体可以发现

p9crn3T.png

只有这一个地方使用了check(),其他代码也都很正常,那么关键就在这个check函数了。

回到pyinstxtractor反编译出来的文件夹,搜索ch可以找到ch.pyc

p9crlDJ.png

使用uncomplyed6即可得到ch.py,打开直接就能看到加密很简单的flag

程序和人有一个能跑就行了

拖进ida简单分析一下,可以发现一个很明显的RC4加密函数

p9crLxU.png

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的代码逻辑不相符

p9cyM79.png

这里不是if else,而是只有if,那么逻辑上讲right是一定会输出的,但事实没有。那么if分支中就有些异样了。换成汇编进入动态分析

QQ20230514140325.png

发现走过了sub_475190却依旧在执行一些ida没有反编译出来的代码。继续往下执行可以看到

QQ20230514140446.png

把这段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的函数。

QQ20230514140834.png

之后进入动态调试,步过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===