首先下载文件 打开 Exeinfo PE拖进去
发现无壳 打开ida
找到主函数 F5 先看看c伪代码
挨个点进去观察
setlocale
banner
prompt_authentication()
authenticate
在authenticticate函数里面发现了关键 decrypt解密关键
跟踪进去
v6存的是传入的s的长度 v4应该是初始为0 v7是a2的长度
wcscpy(dest,s)
把s复制给dest 进行解密操作 那就直接追踪s找到s的值
模拟解密的过程 while循环内的意思是 从0开始,for循环开始,且i小于a2长度(且v4就是计数器小于v6)
i不小于V7(a2长度)时候退出 v4仍然小于 v6继续for循环
总结意思遍历s字符串 每项减去 a[i], i一旦超过a2字符串长度又重置 所以我们可以写代码模拟解密过程
直接选定数据 Shift + E提取数据
#include<stdio.h>
#include<string.h>
#include<iostream>
#include <tchar.h>
#include <cstdlib>
using namespace std;
char s[] =
{
0x3A, 0x14, 0x00, 0x00, 0x36, 0x14, 0x00, 0x00, 0x37, 0x14,
0x00, 0x00, 0x3B, 0x14, 0x00, 0x00, 0x80, 0x14, 0x00, 0x00,
0x7A, 0x14, 0x00, 0x00, 0x71, 0x14, 0x00, 0x00, 0x78, 0x14,
0x00, 0x00, 0x63, 0x14, 0x00, 0x00, 0x66, 0x14, 0x00, 0x00,
0x73, 0x14, 0x00, 0x00, 0x67, 0x14, 0x00, 0x00, 0x62, 0x14,
0x00, 0x00, 0x65, 0x14, 0x00, 0x00, 0x73, 0x14, 0x00, 0x00,
0x60, 0x14, 0x00, 0x00, 0x6B, 0x14, 0x00, 0x00, 0x71, 0x14,
0x00, 0x00, 0x78, 0x14, 0x00, 0x00, 0x6A, 0x14, 0x00, 0x00,
0x73, 0x14, 0x00, 0x00, 0x70, 0x14, 0x00, 0x00, 0x64, 0x14,
0x00, 0x00, 0x78, 0x14, 0x00, 0x00, 0x6E, 0x14, 0x00, 0x00,
0x70, 0x14, 0x00, 0x00, 0x70, 0x14, 0x00, 0x00, 0x64, 0x14,
0x00, 0x00, 0x70, 0x14, 0x00, 0x00, 0x64, 0x14, 0x00, 0x00,
0x6E, 0x14, 0x00, 0x00, 0x7B, 0x14, 0x00, 0x00, 0x76, 0x14,
0x00, 0x00, 0x78, 0x14, 0x00, 0x00, 0x6A, 0x14, 0x00, 0x00,
0x73, 0x14, 0x00, 0x00, 0x7B, 0x14, 0x00, 0x00, 0x80, 0x14,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
unsigned char a[]=
{
0x01, 0x14, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x03, 0x14,
0x00, 0x00, 0x04, 0x14, 0x00, 0x00, 0x05, 0x14, 0x00, 0x00
};
int main()
{ int num=0;
for(int i=0;i<150;i++)
{
s[i]-=a[(num++)%20];
if(s[i])
printf("%c",s[i]);
}
return 0;
}
最后得到flag
菜鸡总结:
知道如何提取直接提取数据 不是选定复制而是Shift +E
更熟悉了通过理解通过c伪代码追踪关键信息操作
待解决:
1.如何通过动态调试 找到flag
2.如何直接找到伪代码中变量s对应的 view窗口中汇编数据地址和值(而不是在view界面通过主函数一步步 找到s对应的数据 (已解决)
wchar?