解题思路

思路主要参考网上writeup,一步步做出来的。

png中隐藏着exe文件

1

MZ文件头,即(4D5A9000…),从这开始到最后的字节都提取出来,为一个exe文件。此时的exe文件因为缺少PE头无法被ida识别,因此加一个PE头 50 45 00 00

2

也可以通过010editor在模板中修改

3

用ida打开该exe文件

4

判断这是一个解密过程,即 为部分字节数据进行异或解密,用脚本进行解密。

1
2
3
4
5
6
7
8
9
10
11
with open(r"C:\Users\hahbiubiubiu\Downloads\file\bingo.exe", 'rb') as f:    
data = f.read()
data = list(data)
text_segment_size = 0x3E000 - 0x1000
# 0x3E000是大小
# 0x1000是偏移
key = 0x22
for i in range(0x1000, 0x1000 + text_segment_size):
data[i] ^= key
with open(r"C:\Users\hahbiubiubiu\Downloads\file\bing0_xor.exe", 'wb') as f:
f.write(bytes(data))

执行脚本后得到新的exe文件,ida打开它

5

除了前面的异或,它跳到了0x408BE0的位置

6

Edit->Segments->Rebase Progarm…->修改value为0

7

8

该函数地址修改为0x8BE0

9

在010editor中修改程序入口点为0x8BE0

10

再次用ida打开exe文件发现程序多了两个main函数,main_0函数就是程序主逻辑

11

12

_strrev是对字符串进行倒转的函数,根据逻辑,写出脚本

1
2
3
4
5
6
7
8
9
a = "zaciWjV!Xm[_XSqeThmegndq" 
b = 29 flag = ""
for i in range(len(a)):
t = math.sqrt(pow(ord(a[int(i/2)]), 2.0) + pow(b, 2.0)) + 0.5
k = int(t)
b += 1
flag += chr(k)
a = a[::-1] print(flag[::-1])
# flag{woc_6p_tql_moshifu}