做题笔记。
下载 查壳。
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}