3.17逆向分析练习
“真相在代码中沉睡,等待逆向者将其唤醒…”
老师说要写像研究生的报告…
题目链接:http://124.16.75.116:52014/challenges
ezzre
使用ExeinfoPE对目标进行检查,目标是一个64位exe文件,有upx壳。使用upx命令脱壳后用ida查看
main的主要逻辑:用户输入flag,对flag进行s78操作得到flag2,如果flag2的每一位都等于answer每一位加一,就输出Good
1 | printf_0("plz input your flag:"); |
(使用了ChatGPT)
s78是base64加密
1 | encoded_data[j] = base64_table[(triple >> 18) & 0x3F]; |
所以总体关系是Base64(flag) = answer + 1,对answer +1进行base64解码得到flag
解密脚本:
1 | import base64 |
运行得到
1 | Base64: ZmxhZ3toMHdfZ28wZF93MHJLXzlvdV9EMWQhfQAA |
re2
(ChatGPT分析)
main:
1 | if ( fgets(s, 256, stdin) ) |
校验方程:
1 | v9[n29 + 11] = rol( v9[n29 % 11] ^ n7 ^ s[n29], n29 % 5 ) |
v9 的构造
1 | for (i = 0; i < 11; i++) |
v9[0..10]→ keyv9[11..39]→ target(用于校验)
输入限制, flag 长度 = 29
1 | if (strlen(s) == 29) |
n7 变化
1 | 初始:n7 = 7; |
逆向公式:
1 | v9[i+11] = rol(v9[i%11] ^ n7 ^ s[i], i%5) |
注意rol和n7、s等都是8位的,在python中运算要手动截断一下
解密脚本:
1 | def rol(x, r): |
运行得到flag
1 | flag{tiny_vm_style_transform} |
easyyre
(ChatGPT分析)
是一道RUST题,看着吓人,逻辑还挺简单的
main函数主要逻辑:
1 | //处理输入 |
链式异或。key(n85)是每一轮更新的
1 | let mut key = 85; |
最后与目标字符串比较。找到目标字符串的值:
1 | .rodata:000000000004D129 28 4F 29 4C 28 4B 29 48 33 54… _O_L_K_H3T5Y? db '(O)L(K)H3T5Y?' |
脚本:
1 | target = "(O)L(K)H3T5Y?" |
得到flag
1 | flag{abcdefg} |