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!

 

posted @ 2020-03-20 22:34  Hk_Mayfly  阅读(257)  评论(0)    收藏  举报