LLVM IR文件:
这是 LLVM 编译器框架的中间表示代码,介于高级语言(如 C/C++)和机器码之间。
1.识别
用@开头定义全局变量

变量以%开头

2.处理方法
文本文件->.bc文件->.s文件->可执行文件
1)
更改文件后缀为.bc
2)
打开kali,把.bc文件移到桌面
在终端输入(配置LLVM)
sudo apt-get install llvm
在桌面打开终端,并输入
llc chall.bc -o chall.s
3)
再输入
gcc -c chall.s -o hello
得到名为hello的文件就是可执行文件
3.反编译
ida正常反编译
程序先进行rc4加密
再进行变种b64加密
有密文,有rc4密钥,可以求解
主要说一下这个b64的逻辑

这里a3是密文,已知,每四个一组
a1是要求的明文(rc4加密后的结果),每三个一组
先忽略+61
每组:
a3[0] = a1[0]的高6位
a3[1] = a1[1]的高4位 位或 a1[0]的低2位*16 //乘16相当与左移4
即a3[1] = 00 + a1[0]的低2位 + a1[1]的高4位 //表示八位二进制位,不是在作加法
同理a3[2] = 00 + a2[1]的低4位 + a1[2]的高2位
a3[3] = 00 + a1[2]的低6位
因此,解密逻辑就是
1.把a3每个字符变ascii码,减去61
2.对a3每四个分一组,作循环
3.循环内按上面的加密原理,取a3对应的那几位,组合出a1
每次循环出来a1的三个数
4. 解密
先进行变种b64解密
enc = "@BdxRTbRBbjIVf`PEyqe^\\^\\|cc|JRubaGLytHeRI@jgNegHU[Myy]=="
enc = list(enc)
for i in range(len(enc)):
enc[i] = ord(enc[i]) - 61
arr = [0,4,8,12,16,20,24,28,32,36,40,44,48,52]
dec=list()
for i in arr:
dec.append((enc[i]<<2)|(enc[i+1]>>4))
dec.append(((enc[i+1]&15)<<4) | (enc[i+2]>>2))
dec.append(((enc[i+2]&3)<<6)|(enc[i+3]))
print(dec)
得到rc4密文,最后的两个0由于等号补位,原本就不存在,删去即可
[12, 89, 251, 85, 121, 85, 22, 91, 76, 102, 152, 211, 35, 205, 40, 133, 248, 95, 254, 105, 191, 53, 94, 37, 144, 163, 252, 220, 186, 21, 48, 59, 106, 70, 138, 139, 97, 228, 60, 242, 0, 0]
再进行rc4解密
def rc4_variants_decrypt(ciphertext, key):
S = list(range(256))
j = 0
for i in range(256):
j = (j + S[i] + ord(key[i % len(key)])) % 256
S[i], S[j] = S[j], S[i]
i = 0
j = 0
plaintext = []
for k in range(len(ciphertext)):
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
xor_index = (S[i] + S[j]) % 256
plaintext.append(chr(ord(ciphertext[k]) ^ S[xor_index]))
return ''.join(plaintext)
# Encrypted data from the original code
encrypted_data = [12, 89, 251, 85, 121, 85, 22, 91, 76, 102, 152, 211, 35, 205, 40, 133, 248, 95, 254, 105, 191, 53, 94, 37, 144, 163, 252, 220, 186, 21, 48, 59, 106, 70, 138, 139, 97, 228, 60, 242]
# Convert encrypted data to bytes
ciphertext_bytes = bytes([b & 0xFF for b in encrypted_data])
# Key used in the encryption process
key = "\x11E\x14avalon,yyds"
# Decrypt the ciphertext
decrypted_text = rc4_variants_decrypt(ciphertext_bytes.decode('latin1'), key)
print("Decrypted text:", decrypted_text)
得到
Decrypted text: moectf{Y0u_Kn0w_1lVm_ir_c0d3_A_l0t_!1!1}
1077

被折叠的 条评论
为什么被折叠?



