[CTF/Reverse] [FlareOn3]unknown
侧边栏壁纸
  • 累计撰写 65 篇文章
  • 累计收到 3 条评论

[CTF/Reverse] [FlareOn3]unknown

x1n
x1n
2022-04-13 / 0 评论 / 7 阅读 / 正在检测是否收录...

[FlareOn3]unknown

image-20220405145516478-16491417173191.png

32位WinPE

image-20220405151040723.png

一个参数, 要过401020的检测

image-20220405151120764.png

这里v20 Xor 定值需要是 v6, v6是过2760的参数

image-20220405151415683.png

感觉有点像37进制读入 改名atoi_b37, 注意到这个程序基本都是双字节char, 那些WORD来WORD去的都写成uint16就行 (后来脑瓜一闪反应过来这不是哈希么..)

image-20220405152039186.png

要求0x1B个v13里的内容等于v11, v11在这

image-20220405152121676.png

长104个Byte应该是

image-20220405152340621.png

注意cmptable经过了一个thiscall函数改过, 有个长256的表, 这个换表操作让我感觉是现成的加密算法, 是不是有点像..RC4?同时这个表也输入相关, 但是好像只和输入长度有关

image-20220405153034553.png

v16-v4大概就是一个输入长度相关量, 另外这里也和v20有点关系, 结合循环变量0x1B, 我觉得基本能推测输入长度是27, 每次取出1位放到v23[0], v23其他的值都是固定/可测的, 这个东西被atoi_b37之后要和cmptable相同. 我们试一下len=27的cmptable

unsigned char cmptable[] =
{
  0xE9, 0x67, 0xFD, 0xB2, 
    ....
  0xF5, 0xEA, 0x6D, 0xE1
};

而v23则是

input[j], 0x60+j, 0x46, 0x4C, 0x41, 0x52, 0x45, 0x20, 0x4F, 0x6E, 0x21

后面量是上面能找得到的, 就是FLARE On!

这样四位一比长度应该是26的, 直接爆破一下

unsigned char cmptable[] =
{
  0x1F, 0xD0, 0x24, 0x4C, 0xEA, 0x1D, 0xDA, 0xAE, 0x57, 0x05, 
  0x2B, 0x4E, 0xAE, 0x68, 0xC7, 0x4D, 0xF0, 0x6A, 0x42, 0x79, 
  0x2B, 0x80, 0xC4, 0x39, 0xD9, 0x8C, 0xE2, 0xCD, 0x32, 0x5E, 
  0x77, 0x23, 0x54, 0xC4, 0x31, 0x36, 0x2E, 0x8D, 0x50, 0xDA, 
  0x48, 0x79, 0x43, 0xE9, 0xA6, 0x11, 0xE2, 0x56, 0xB0, 0x6A, 
  0x05, 0xE6, 0xF4, 0x8F, 0x1C, 0xC2, 0x29, 0x8B, 0x95, 0x32, 
  0xF9, 0x88, 0x66, 0x80, 0x72, 0x2F, 0xF3, 0xCE, 0x56, 0x24, 
  0xBC, 0xE4, 0x72, 0x6B, 0xFB, 0x52, 0xBF, 0x20, 0x06, 0xCC, 
  0x8A, 0xEB, 0x00, 0xA9, 0xC6, 0x90, 0x39, 0xAC, 0x4D, 0x50, 
  0xAC, 0xD2, 0x8B, 0x5C, 0xF9, 0xFA, 0x66, 0x38, 0xAD, 0x12, 
  0x47, 0x6B, 0xA8, 0x31
};
#include <cstdio>
#include <cstdint>
int sum(char s[15]) {
    int res = 0;
    for(int i = 0; i < 11; i ++ ) {
        res = s[i] + 37*res;
    }
    return res;
}
int main() {
    int *p = (int *)cmptable;
    char s[15] = "a`FLARE On!";
    // (0x60+i) * 37 ^ 9 + ch * 37 ^ 10;
    for(int i = 0; i < 26; i ++ ) {
        for(int j = 0; j < 0xFF; j ++ ) {
            s[0] = j;
            int tmp = sum(s);
            if(tmp == p[i]) {
                printf("0x%x, ", tmp);
                break;
            }
        }
        s[1] ++;
    }
}

爆破无果, 那只能是cmptable还有问题, 我们回头看发现这个table竟然和文件名本身有关?? 这个很不美啊.. 我们要尝试找到真正的文件名, 看起来unknown并不是

image-20220405155938445.png

MS编译器往往会有这么一个东西

重新提重新爆

image-20220405162327447.png

0

评论 (0)

取消