1.分析
32位文件,拖进ida pro分析
进入main函数
authenticate()函数中有一个decrypt函数
unk_8048B44是 success! 说明ws要和s2相同
fgets函数char *fgets(char *str, int n, FILE *stream)
从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
- str -- 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
- n -- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
strcmp函数int strcmp(const char *str1, const char *str2)
把 str1 所指向的字符串和 str2 所指向的字符串进行比较
- 如果返回值小于 0,则表示 str1 小于 str2。
- 如果返回值大于 0,则表示 str1 大于 str2。
- 如果返回值等于 0,则表示 str1 等于 str2。
进入descrypt()函数:s是0x143A,0x1436,0x1437... dword_8048A90是0x1401,0x1402,0x1403,0x1404,0x1405
2. exp
参照decrypt()写一个exp.py得到flag
s=[0x3a, 0x36, 0x37, 0x3b, 0x80, 0x7a, 0x71, 0x78, 0x63, 0x66, 0x73, 0x67, 0x62, 0x65, 0x73, 0x60, 0x6b, 0x71, 0x78, 0x6a, 0x73, 0x70, 0x64, 0x78, 0x6e, 0x70, 0x70, 0x64, 0x70, 0x64, 0x6e, 0x7b, 0x76, 0x78, 0x6a, 0x73, 0x7b, 0x80]
v6 = len(s)
a2 = [1,2,3,4,5]
v7 = len(a2)
v2 = v6
dest = s
v4 = 0
while v4<v6:
dest[v4] -= a2[v4%5]
v4+=1
flag = ''
for j in dest:
flag+=chr(j)
print(flag)