记一次ctf逆向AK
ctf个人赛AmaZing_BruteForce

下载得到amazingbruteforce.exe
首先看有没有壳

有壳,用upx工具解壳,在upx文件夹目录打开终端,输入
upx.exe -d C:\Users\Administrator\Desktop\amazingbruteforce.exe

在看一下就可以看到已经没壳了

无壳,64位可执行程序,用ida打开一般找main函数
ida基础教程
https://hello-ctf.com/HC_Reverse/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E7%9A%84IDA/#ida-view-a

打开找到main函数,然后使用万能f5,查看
分析可知v4是由四个小写字母组成的数组,v5数组这里采用小端存储,可按shift+e提取数据

且v5进入了一个加密函数,双击跟进函数
可知v5数组跟前面的v4异或可得结果,根据文件名提示force和分析代码猜测前面四个字母为flag,且采用爆破,直接上脚本
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main(){
unsigned char v5[] = {
0x08, 0x05, 0x0A, 0x02, 0x15, 0x23, 0x3E, 0x36,
0x3A, 0x36, 0x2F, 0x55, 0x31, 0x58, 0x3F, 0x18
};
char v4[11];
for(int i=0;i<4;i++){
for(char j='a';j<='z';j++){
if(i==0&&(char)(j^v5[i])=='f'){
v4[i]=j;
break;
}
if(i==1&&(char)(j^v5[i])=='l'){
v4[i]=j;
break;
}
if(i==2&&(char)(j^v5[i])=='a'){
v4[i]=j;
break;
}
if(i==3&&(char)(j^v5[i])=='g'){
v4[i]=j;
break;
}
}
}
int c4 = 4, c5 = 16;
for (int i = 0; i < 16; ++i ) {
v5[i]^=v4[i%c4];
printf("%c",v5[i]);
}
}
//flag{JUST_D0_1T}
编译运行就能得到flag