64位ida,7.0的,(最近用7.5老抽风,好多数据我都找不到)
查看字符串,发现三个特殊的字符
其中那个ABCD肯定是base64加密了,跟进去主要看一看这个函数名字,是sub_400E44
其他俩个跟进去就是主函数了.
分析主函数
sub_4406E0 这个代码基本上是看不懂的,但是可以注意到里面有一个sys_read ,可以猜测是读取字符串内容的
sub_424BA0,这个进去看内容其实我也看不懂,但是根据下面的for循环可以判断出,这个是读取字符串长度的,尤其是这一步可以判读这点
因为这是for循环的结束条件,就猜吧.
然后根据这段for循环写个脚本看看输出了什么,字符串我的ida直接显示了,之前用7.5也找不到,我的问题吧.
脚本
#include <iostream>
int main(){
char a[]={73,111,100,108,62,81,
110,98,40,111,99,
121,127,121,46,105,127,100,96,51,119,125,119,101,107,57,123,105,121,61,126,121,76,
64,
69,
67
};
char flag[66];
for(int i=0;i<36;i++){
flag[i] = a[i] ^ i;
std::cout<<flag[i];
}
system("pause");
return 0;
输出:Info:The first four chars are flag
只能确定前四个字符.
接着是几次base64加密,这边试了下,不仅仅是字符串里看到的那行,后面那一大串都是的,我是笨比,用网站解了好几次,让我看到了那篇帖子.
在?给个flag
对,这个网址就是要对各位进行现场教学,挺好的,值得一看
看了很多wp后回来继续写
忘了在哪一个wp里看到这个函数实在程序结束后将会执行
然后看到下面那行
通过倒着 异或 推出 v3,注意v6是个数组,v3,v6中间其实还有v3,4,5,6
这就是个数组
为什么v3会是一个数组呢,因为HIBYTE()函数的作用是获取高字节也就是数组的最后一位,同时还有BYTE()、BYTE1()、BYTE2()第一个是获取数组的第一位,第二个就是获取第二位,依次类推。
脚本
#include <iostream>
using namespace std;
int main(){
char a[]={0x40,0x35,0x20,0x56,0x5D,0x18,0x22,0x45,0x17,0x2F,0x24,0x6E,0x62,0x3C,0x27,0x54,0x48,0x6C,0x24,0x6E,0x72,0x3C,0x32,0x45,0x5B};
char flag[66];
char b[5]= "flag";
char c[4];
for(int i=0;i<4;i++){
c[i] = b[i] ^ a[i];
cout<<c[i];
}
cout<<endl;
for(int i=0;i<25;i++){
flag[i] = a[i] ^ (c[i%4] );
cout<<flag[i];
}
system("pause");
return 0;
}
flag{Act1ve_Defen5e_Test}