打开文件
文本文件给出了提示
文件没有加壳 直接拖入IDA
进入start函数
hFile = GetStdHandle(0xFFFFFFF6)
调用GetStdHandle
函数获取标准输入句柄
使用WriteFile
函数向dword_403074
)写入一段数据,长度为0x13
字节。
继续跟进sub_401000函数
首先,通过调用sub_401000
函数获取一个初始的v4
值。
然后,使用一个for循环,从v1 - 1
到0遍历byte_403078
数组。在每次迭代中,它执行一个异或操作(^
),将v4
与byte_403078[i]
的值进行异或,并将结果存储在byte_403180[i]
中。之后,更新v4
的值为byte_403078[i]
,以便在下一次迭代中使用。
接下来我们进入sub_401000
函数找v4的值
这里认识了一个新函数 _ROL4_函数是一个自定义的循环左移函数
__ROL4__(-2147024896, 4)
将-2147024896
的二进制表示循环左移4位。这意味着最左边的4位(1000
)会被移动到最右边,并与原来的数组合。因此,循环左移后的二进制表示变为0000 0000 0000 0000 0000 0000 1000 0000
。但是这里循环左移四位后再右移一位,最终返回值是0x380004,也就是v4初值
编写解密脚本
# 定义编码后的标志数据
encode_flag000 = bytes([
0x0D, 0x26, 0x49, 0x45, 0x2A, 0x17, 0x78, 0x44, 0x2B, 0x6C,
0x5D, 0x5E, 0x45, 0x12, 0x2F, 0x17, 0x2B, 0x44, 0x6F, 0x6E,
0x56, 0x09, 0x5F, 0x45, 0x47, 0x73, 0x26, 0x0A, 0x0D, 0x13,
0x17, 0x48, 0x42, 0x01, 0x40, 0x4D, 0x0C, 0x02, 0x69, 0x00
])
# 初始值tmp
tmp = 0x380004
# 解码后的标志,初始化为全零的字节数组
flag = bytearray(40) # 分配40个字节的空间
# 解码过程
for i in range(38, -1, -1): # 从38到0,倒序遍历
flag[i] = encode_flag000[i] ^ (tmp & 0xFF)
tmp = flag[i]
print("Decoded flag (hex):", flag.hex())
得到flag
hex值转换一下
得到flag{R_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com}