2020 新春公益赛 Re 部分WP
奇怪的安装包
测试文件:https://www.lanzous.com/i9y10ed
准备
使用.7z打开安装文件(我的.7z版本为15.05 beta),找到nsis脚本
部分函数解释
IntCmp:
值1 值2 相等时跳转 [值1小时跳转] [值1大时跳转]
比较两个整数 值1 和 值2。如果 值1 和 值2 相等,则跳转到“相等时跳转”,否则如果 值1 < 值2,跳转到“值1小时跳转”,否则如果 值1 > 值2 ,跳转到“值1大时跳转”。
IntFmt:
值1 值2 相等时跳转 [值1小时跳转] [值1大时跳转]
比较两个整数 值1 和 值2。如果 值1 和 值2 相等,则跳转到“相等时跳转”,否则如果 值1 < 值2,跳转到“值1小时跳转”,否则如果 值1 > 值2 ,跳转到“值1大时跳转”。
IntOp:
用户变量(输出) 值1 操作 [值2]
联合值1和(取决于操作)值2到用户变量 $x。操作定义为下列之一:
- + 值1 加 值2
- - 值1 减 值2
- * 值1 乘 值2
- / 值1 除 值2
- % 由 值2 取 值1 的模
- | 值1 和 值2 二进制“或”
- & 值1 和 值2 二进制“与”
- ^ 值1 和 值2 二进制“异或”
- ~ 按位取反 值1(例如 7 变为 4294917288)
- ! 逻辑取反 值1(例如 7 变为 0)
- || 值1 和 值2 逻辑“或”
- && 值1 和 值2 逻辑“与”
详细可见:NSIS使用手册
代码分析
关键地方有两处
调用函数func_429之后,与字符串 gm`fzd787`7bb,g72d,592b,8`g1,cg96813e8d``| 比较
func_429将传入字符串与1做异或运算
解密
# -*- coding:utf-8 -*- encode = "gm`fzd787`7bb,g72d,592b,8`g1,cg96813e8d``|" flag = '' for i in encode: flag += chr(ord(i)^1) print (flag)
EasyEncrypt
测试文件:https://www.lanzous.com/iabxeeh
准备
代码中也存在很多的while,很明显是需要我们进行控制流平坦化。
文件处理与分析
平坦化
参考教程:https://security.tencent.com/index.php/blog/msg/112
使用deflat.py(获取脚本)执行控制流平坦化脚本命令:
python deflat.py polyre 0x400a10
v41 = 0; memset(v61, 0, 0x10uLL); AES_ecb_encrypt(s, v61, v58, v41); // 加密16字节 rewind(*v54); v40 = fwrite(s, 1uLL, 0x10uLL, *v54); // 写入16字节 v14 = printf("wuhu!file has been encrypted\n", 1LL);
实际上就是将flag.lck文件的前16字节,进行AES加密后,再写入到前16字节覆盖。
脚本
# -*- coding:utf-8 -*- from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex def decrypt(text): key = 'thisisthekey!!!!'.encode('utf-8') mode = AES.MODE_ECB cryptor = AES.new(key, mode) plain_text = cryptor.decrypt(a2b_hex(text)) return (plain_text) if __name__ == '__main__': d = b'' new = b'' with open(r'C:\Users\10245\Desktop\re\flag.lck', 'rb+') as f: byte = f.read(16) s = ''.join(["%02x" % x for x in byte]) d += decrypt(s) print (d) f.seek(16,0) old = f.read() new += d + old with open(r'C:\Users\10245\Desktop\re\flag.png','wb+') as f: f.write(new)
get flag!