做题笔记。
下载 查壳。
32ida打开。
进入main:(该改的该)
动调,第一遍,试试水:看看程序的状态。
运行。
发现我们的输入变成了另一种字符,并且还写了个文件。
我们对,input进行追踪。
大胆 猜测,问题出现在 WriteFile 这里。
对 WriteFile 进行溯源,查看其汇编代码。
跟进看看。
跟进第一个函数。
(而且其地址很可疑。401000地址,这太熟悉了。经常作为32位老旧程序的入口点。。。 )
可以动调去实践。
那么,逆向回去就可以了。
脚本:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{unsigned char key[50] ={97, 106, 121, 103, 107, 70, 109, 46, 127, 95,126, 45, 83, 86, 123, 56, 109, 76, 110, 0};char flag[50] = " ";char v3;for (int i = 0; i < 0x13; i++){if (i == 0x12){flag[i] = key[i] ^ 0x13;}else{if (i%2)//奇偶数判断。{v3 = i ^ key[i];flag[i] = v3 + i;}else{v3 = i ^ key[i];flag[i + 2] = v3;}}printf("%c", flag[i]);}printf("\n");system("pause");return 0;
}
不过我少了个字符,但无伤大雅,直接添上就可以了。
至于为什么?
ASCII 32:
验证:
flag{Ho0k_w1th_Fun}