[MoeCTF 2021]baby_bc

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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值