什么是hook? https://www.cnblogs.com/ArsenalfanInECNU/p/12871887.html
查壳
无壳,ida
发现很多对文件的操作。分析一下
如果输入的长度为19,那么就创建一个文件,然后写入文件。如果NumberOfbytesWritten的值为1的话,就说明flag是对的了。进入sub_401240
这里似乎有一个坑,把"This_is_not_the_flag"赋给v4,如果v4里面前21字符的内容和"This_is_not_the_flag"一样,那么就将指针的值变为1,也就是证明flag是正确的。
这里的a1数组即为buffer数组,就是用来存放我们输入的数组,但是注意在main函数中,只有a1数组长度为19时,才会进行下一步,而这里的长度是21,自相矛盾,所以姑且认为这里就是一个干扰项。
然后就得关注到之前被我跳过的一个函数,sub_401220
在这个函数中
于是我们知道IpAddress精确获得了writefile函数的地址,而byte_40C9BC中存储的-23,0-23 = FFFF FFFF FFFF FFE9,E9是jump的字节码,jump指令占5个字节。
所以dword_40C9BD中存放的就是sub_401080到IpAddress加上jmp指令的距离。
jmp指令见:https://www.cnblogs.com/czlnb/p/14618272.html
进入其返回值,sub_4010D0
WriteProcessMemory(hProcess, lpAddress, &byte_40C9BC, 5u, 0);这行把jmp指令写进了write file函数的起始位置,此步就是HOOK.
进入sub_401080
sub_401000加密IpBuffer,sub_401140解密IpBuffer
进入sub_401000
写出解密代码
res = [0x61, 0x6A, 0x79, 0x67, 0x6B, 0x46, 0x6D, 0x2E,
0x7F, 0x5F, 0x7E, 0x2D, 0x53, 0x56, 0x7B, 0x38,
0x6D, 0x4C, 0x6E, 0x00]
flag = [0] * 20 # 初始化一个长度为20的列表
for i in range(len(res)): # 使用 len(res) 遍历所有元素
if i == 18:
flag[i] = res[i] ^ 0x13
elif i % 2:
flag[i] = (res[i] ^ i) + i
else:
if i + 2 < len(flag): # 确保不越界
flag[i + 2] = res[i] ^ i
else:
print(f"Index {i + 2} is out of range for flag list.")
result = ""
for i in range(1,19):
result += chr(flag[i])
print(result)
得到flag