ezCsky
Exeinfo看了不是exe
IDA分析不了,使用鸡爪Ghidra进行分析。这边顺带讲一下Ghidra的基础操作方法
下载Ghidra:https://gitcode.com/gh_mirrors/gh/ghidra_installer
下载java11(对版本有要求)
打开.bat文件
第一次用需要先输入jar文件所在的地址,比如我的就是
C:\Program Files\Java\jdk-11
具体根据自己的情况做出调整
新建文件夹
添加文件
双击
看左边函数这一栏
重点关注这几个函数
找到密文
既然是rc4那肯定还有key
后面还有一步异或
stb r0, 0x2470(0)为异或操作,按位与后一位异或
所以exp的思路就是,先对密文进行rc4解密,再从后往前按位异或
完整的exp
key = 'testkey' enc = [0x96, 0x8F, 0xB8, 0x08, 0x5D, 0xA7, 0x68, 0x44, 0xF2, 0x64, 0x92, 0x64, 0x42, 0x7A, 0x78, 0xE6, 0xEA, 0xC2, 0x78, 0xB8, 0x63, 0x9E, 0x5B, 0x3D, 0xD9, 0x28, 0x3F, 0xC8, 0x73, 0x06, 0xEE, 0x6B, 0x8D, 0x0C, 0x4B, 0xA3, 0x23, 0xAE, 0xCA, 0x40, 0xED, 0xD1]# RC4 解密过程 s_box = list(range(256)) j = 0 for i in range(256): j = (j + s_box[i] + ord(key[i % len(key)])) % 256 s_box[i], s_box[j] = s_box[j], s_box[i]res = [] i = j = 0 for s in enc: i = (i + 1) % 256 j = (j + s_box[i]) % 256 s_box[i], s_box[j] = s_box[j], s_box[i] t = (s_box[i] + s_box[j]) % 256 k = s_box[t] res.append(s ^ k)# 格式化输出为十六进制 hex_res = ['0x{:02x}'.format(byte) for byte in res]# 打印十六进制结果 print('[' + ', '.join(hex_res) + ']')for i in range(40, -1, -1): res[i] = res[i] ^ res[i+1] if i + 1 < len(res) else res[i] result = ''.join(chr(byte) for byte in res)print(result)
flag{d0f5b330-9a74-11ef-9afd-acde48001122}
Dump
用winhex打开flag文件
用ida打开re.exe
酷似ollvm混淆
用D810去控制流平坦化时失败。
看到题目提示,字符编码算法,同时flag长度为22?!先运行re.exe看看
显然每个字符数字和字母在运行后输出的结果是固定的hex值,所以可以直接把所有的可能跑出来
然后对照flag的hex值,得到flag
数字比赛时给出了是4
flag{MTczMDc4MzQ2Ng==}