(DDCTF 19)reverse1_final
直接拉进od,发现进去之后不像是在正常的程序领空,PEiD查一下,发现是一个UPX类型的壳。
百度下载脱壳机,脱壳。
然后拉入od分析,发现我们输入的字符串被程序加密后与“DDCTF{reverseME}
”作比较;
也就是flag输入进去之后会被程序加密为“DDCTF{reverseME}
”;
将其拉入ida分析
很明显,该函数便是加密函数;进入内部查看
很明显,该函数便是加密函数;进入内部查看
老实讲,第一次做的时候看到这个*v1 = byte_402FF8[(char)v1[v4]]
我没看懂是什么操作,先是v4= a1-v1
然后反手取从402FF8开始往后的402FF8+(v1[v4])
地址的字符,我确实懵了,完全不知道什么鬼,v1是什么都不知道,只能先去查一下402FF8这个地址附近的内容,然后无奈去od里面看了这个步骤是怎么在搞。
搜索字符串找到关键输入处,跟踪进去,下断点,调试
在输入提示语附近就是输入命令(2)和关键函数(3)的所在地
进入3所指的call内部,进一步观察
发现两处汇编循环,观察寄存器和堆栈数据得知上面的是“strlen”函数对应的操作
下面的便是do...While
循环
加密算法为:将所输入的字符串的每个字符分别与0x402FF8
相加,在此处所对应的字符即为加密后的新字符
写一个小脚本,如下:
#include<iostream>
using namespace std;
int main()
{
char a[]="1~}|{zyxwvutsrqponmlkjihgfedcba`_^]1[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(";
char b[16];
int i;
char c[]="DDCTF{reverseME}";
for(i=0;i<16;i++)
{
for(char n='!';n<126;n++)
{
b[i]=a[(int)n-31];
if(b[i]==c[i])
{
cout<<n;
break;
}
}
}
cout<<endl;
return 0;
}