0x00 前言
go语言,最好上IDA8.3,没删的话可以恢复符号
0x01 解
无壳,直接上IDA
一进来就看到isDebuggerPresent
直接改为jmp
对于golang来说,调试经常会飞出去,因此要多用F4(Run to cursor)
在接受输入的地方下个断点,运行发现这边检查了长度是否为5
重新调试,输入5字节后走到这,发现调用了一个NewCipher函数,在go里面就是获取了一个Cipher对象,之后又去读了flag.png
继续向下走,发现有个循环异或
将输入的第二位和png的内容进行逐字节异或
之后又是一个循环
一步步进行分析,发现是进行了如下操作
这实际上是魔改的RC4算法,最后多了个异或0x11,rdx的值随着密钥的改变而改变
执行完这个循环可以发现写文件去了
输入要求一共五位,由于png头固定,因此直接爆就行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| import itertools import string import tqdm charset = string.digits + "abcdefghijklmnopqrstuvwxyz" enc = [0x85, 0x43, 0x72, 0x78, 0x26, 0xC0, 0x2E, 0x6E] plain = [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]
def KSA(key): """ Key-Scheduling Algorithm (KSA) 生成S盒 """ if isinstance(key, str): key = key.encode()
S = list(range(256)) j = 0 for i in range(256): j = (j + S[i] + key[i % len(key)]) % 256 S[i], S[j] = S[j], S[i] return S def PRGA(S): """ Pseudo-Random Generation Algorithm (PRGA) 生成密钥流 """ i, j = 0, 0 while True: i = (i + 1) % 256 j = (j + S[i]) % 256 S[i], S[j] = S[j], S[i] K = S[(S[i] + S[j]) % 256] yield K def RC4(key, text): """ RC4 encryption/decryption """ S = KSA(key) keystream = PRGA(S) res = [] for char in text: res.append(char ^ next(keystream) ^ 0x11 ^ key[1]) return bytes(res)
enc = bytes(enc) for key in tqdm.tqdm(itertools.product(charset, repeat=5)): key = ''.join(key).encode('utf-8') enc1 = RC4(key,plain) if enc1 == enc: print() print(key) break
|
输进exe里面就能解密出png了