2024ciscn 逆向ezCsky和dump详解

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==}

posted @ 2024-12-16 20:04  XFocus666  阅读(253)  评论(0)    收藏  举报