复现题
我下载的时候这个题缺了个dll,补上后运行下程序,观察。
需要输入授权字符串。拖入IDA查看,查看字符串,发现有限制调试工具的代码,解除。
找到第一个输入点。需要输入符号位运算的合法输入,写个脚本破解,如下:
str = [0x52, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x48, 0x6f, 0x70, 0x70, 0x65, 0x72, 0x21]
arr = [17, 8, 6, 10, 15, 20, 42, 59, 47, 3, 47, 4, 16, 72, 62, 0, 7, 16]
flag = ''
for i in range(18):
for j in range(127):
v43 = ~(j & str[i % 14]) & (j | str[i % 14])
if v43 == arr[i]:
flag += chr(j)
print(flag)
得到结果:
输入验证后发现程序直接退出了。
接着往下看,发现text代码段有一段数据,没有解析为指令。
使用IDA分析下看看,没有解析成功,应该是人为加密了。用交叉引用查哪里曾经调用了这段代码。发现有段汇编call了那段数据,说明是个函数。此处查看下伪代码,找到了一个加密数据的函数。
这个函数调用了一个win32API,而根据微软msdn中给出的描述,这个API的作用是指定某段区域设置访问保护,然后这个函数紧接着对保护区域与输入进行异或以加密。
我们只需要对保护区域的数据进行解密即可用IDA分析得到保护区域的原数据,也就是汇编指令。
参考大佬的脚本后发现,可以直接用IDAPython的API进行操作,实在是太方便了。脚本如下(必须要在IDA中跑):
input =[67, 97, 117, 99, 97, 115, 117, 115, 64, 115, 95, 97, 98, 105, 108, 105, 116, 121]
for i in range(1045):
address = 0x10040164D + i
byte = get_bytes(address, 1)#IDApythonAPI,作用是获取指定地址的指定字节数
byte = ord(byte) ^ input[i%18]
patch_byte(address, byte)#IDApythonAPI,更改指定地址的字节为byte
分析解密的数据段,并创建函数,查看伪代码。
上图红框同样和第一次输入时做了类似的事情。写个逆向脚本破解即可,如下:
data = [
2007666,
2125764,
1909251,
2027349,
2421009,
1653372,
2047032,
2184813,
2302911,
2263545,
1909251,
2165130,
1968300,
2243862,
2066715,
2322594,
1987983,
2243862,
1869885,
2066715,
2263545,
1869885,
964467,
944784,
944784,
944784,
728271,
1869885,
2263545,
2283228,
2243862,
2184813,
2165130,
2027349,
1987983,
2243862,
1869885,
2283228,
2047032,
1909251,
2165130,
1869885,
2401326,
1987983,
2243862,
2184813,
885735,
2184813,
2165130,
1987983,
2460375]
v61 = 0x4CE3
v62 = 0x8000000B
flag = ''
for i in range(51):
for j in range(127):
v60 = v61 * j % v62
if v60 == data[i]:
flag += chr(j)
print(flag)
运行获得flag
flag{Thousandriver_is_1000%_stronger_than_zero-one}