做题笔记。
下载 查壳。
64ida打开。
找到main:(该改名字的改名。)
那么大概就是s1和input进行 XOR 然后得到s2。就完了?这么简单?
额,跟踪s1 你还会发现一样东西:
最开始,额,我写完运行就感觉不对劲。
(怀疑自己错了。。 - -)
那就动调呗:
但是又会发现根本走不到断点这里。
不能动调?
可以动调的。
此时,可以大胆猜测,其实main函数并不是一开始就载入执行的函数。
我们对main进行跟踪。
F9就好,(或者你想看程序逻辑就F7、F8)
因为我们主要是想得到s1变化的值。
shift+e提出来就好。
那此时程序逻辑很清晰了。
先将s1的值进行^2 + 65的操作。在和input进行xor。之后的值与s2进行比对。
脚本:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char s3[50] = " ";
unsigned char s1[50] =
{
48, 34, 54, 63, 42, 50, 57, 40, 34, 50,
38, 47, 58, 45, 47, 58, 7, 4, 13, 9,
27, 13, 10, 7, 31, 25, 16, 19, 31, 28,
31, 23, 239, 131,0
};
unsigned char s2[50] =
{
86, 78, 87, 88, 81, 81, 9, 70, 23, 70,
84, 90, 89, 89, 31, 72, 50, 91, 107, 124,
117, 110, 126, 110, 47, 119, 79, 122, 113, 67,
43, 38, 137, 254,0
};
for (int i = 0; i < strlen(s1); i++)
{
s3[i] = s1[i] ^ s2[i];
printf("%c", s3[i]);
}
printf("\n");
system("pause");
return 0;
}
flag{c0n5truct0r5_functi0n_in_41f}
总结:思维逻辑很重要。也要相信自己,不要怀疑自己的能力。