LitCTF RE方向 WP

文章讲述了如何对Python的pyc文件进行反编译,使用uncomplyed6和在线工具,以及pyinstxtractor。过程中涉及了RC4加密算法的识别与解密,以及对异常处理和base64编码的分析,最终通过动态调试和编写脚本得到解密结果。
摘要由CSDN通过智能技术生成

从第四题开始看吧

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===

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值