# N1CTF Junior WP
# reserve
# checkin-rs
# 题目分析
拿到文件 由题目标题知是 rust 语言编写的 之前没接触过 rust 的逆向题只好硬着头皮先放进 IDA 看看
首先搜索 main 函数 找到这个带有字符串的函数就是主函数了
v0 先是赋值了 32 字节 又 cpy 了 14 字节 总共是 46 字节 通过动调和 lazyIDA 可提取出来
[0x7D, 0x20, 0x23, 0x22, 0x25, 0x24, 0x68, 0x72, 0x6E, 0x56, 0x79, 0x62, 0x53, 0x79, 0x7D, 0x7A, 0x62, 0x4E, 0x7C, 0x7A, 0x7F, 0x76, 0x73, 0x7F, 0x7B, 0x46, 0x7F, 0x68, 0x6E, 0x78, 0x68, 0x7A, 0x52, 0x7E, 0x5B, 0x50, 0x45, 0x40, 0x5D, 0x4C, 0x46, 0x5C, 0x5A, 0x48, 0x49, 0x5E]
最后面这部分应该对解题帮助不大 就是判断输入之后的成功或失败 然后释放前面使用的内存什么的
中间部分的前面是有关线程使用的一些判断,正常情况没有报错就不会执行
后面的多线程就是关键了
对这部分 我昨天动态调试了很久没有看懂 然后 hint1 放出来了 于是去 rust 官网下载了 rust 在 VScode 上编译了一个多线程 rust 程序放进 IDA 看看 要能找到线程 handler 就能找到关键
然后查看 main 函数就发现 sub_1400027B0 是 main 函数 sub_140002EB0 就是 handler 相关的
这时准备开摆了 放出了第二个 hint 叫我们在 bcmp 函数下断点观察输入的变化 就是黑盒分析吧
v23 是加密后的输入
通过很多次尝试 (比如输入 46 个 1,16 个 1 后面是 2,secpunk {},secpunk {11111} 之类的)
发现输入的字符串加密后最后一个字符经过加密后是不变的
发现前面的 v26 就是输入 v25 是加密后的数据 v24 又递加
最后一个字符没变就是异或 0 于是就试了 0-45 的异或比较数据 直接得出 flag
# 脚本
flag=[0x7D, 0x20, 0x23, 0x22, 0x25, 0x24, 0x68, 0x72, 0x6E, 0x56, 0x79, 0x62, 0x53, 0x79, 0x7D, 0x7A, 0x62, 0x4E, 0x7C, 0x7A, 0x7F, 0x76, 0x73, 0x7F, 0x7B, 0x46, 0x7F, 0x68, 0x6E, 0x78, 0x68, 0x7A, 0x52, 0x7E, 0x5B, 0x50, 0x45, 0x40, 0x5D, 0x4C, 0x46, 0x5C, 0x5A, 0x48, 0x49, 0x5E] | |
kkk=0 | |
print(len(flag)) | |
for i in range(len(flag)): | |
flag[i]^=kkk | |
kkk=kkk+1 | |
print(flag) | |
str='' | |
for i in range(len(flag)): | |
str+=chr(flag[i]) | |
flag=list(str) | |
for i in range(45,-1,-1):#因为 lazyIDA 提取数据的原因前面异或之后是倒序后面再倒过来 | |
print((flag[i]),end='') | |
'''运行结果: | |
46 | |
[125, 33, 33, 33, 33, 33, 110, 117, 102, 95, 115, 105, 95, 116, 115, 117, | |
114, 95, 110, 105, 107, 99, 101, 104, 99, 95, 101, 115, 114, 101, 118, 101, | |
114, 95, 121, 115, 97, 101, 123, 107, 110, 117, 112, 99, 101, 115] | |
secpunk{easy_reverse_checkin_rust_is_fun!!!!!} | |
Process finished with exit code 0 | |
''' |
# n0th1ngG0
# 题目分析
开始做的时候附件已经更新过了 直接下载的简单版本
同时题目描述说了如果认识这个算法就直接冲 推测应该是某种加密算法
2 个版本我直接把 windows 版放进 IDA
这里注意 go 语言逆向题 main 函数是 main_main
关键就是中间的 main_crypto_Crypt 了 这里发现了 2 段常量字符数组 一段为密钥一段为比较数据
点开是 2 个 WTF 函数充斥着 RC4 算法的特征 这时候还没细看 直接动态调试提取 key 试试原版 RC4 (感觉一般 RC4 不会魔改吧)
前面对 key 有个循环处理不用管 直接提取处理后的 secpunk:
RC4 为对称加密 把比较数据转换为 hex 字符串然后 RC4 就能得到 flag
secpunk
成功 get flag