avatar
lucky blog
← 返回列表

记一次ctf逆向AK

记一次ctf逆向AK

ctf个人赛AmaZing_BruteForce

image-20241216100251014

下载得到amazingbruteforce.exe

首先看有没有壳

image-20241216100318463

有壳,用upx工具解壳,在upx文件夹目录打开终端,输入

upx.exe -d C:\Users\Administrator\Desktop\amazingbruteforce.exe

image-20241216100517064

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

image-20241216100626622

无壳,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

image-20241216102324839

打开找到main函数,然后使用万能f5,查看

分析可知v4是由四个小写字母组成的数组,v5数组这里采用小端存储,可按shift+e提取数据

image-20241216102452439

且v5进入了一个加密函数,双击跟进函数9ba91de6231144eda2bd0ffba507c3c8.png

可知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