下载题目
国际惯例先查壳
64位C++程序无壳
直接进IDA
可以看到子函数非常多,挨个看肯定不现实,Shitf+F12直接看字符串吧
找到关键点了
点进去看看
看来关键子函数在sub_140016070
点进去
程序最终的判断逻辑是V9跟Buf1进行比较
V5有四个数组0123,看来有四种加密方式,将数据传给V9
挨个进去看看
第一个加密过程
类凯撒加密
第二个加密过程
跟KEY“NewStarCTF”里的值循环相加,用了一个 i % 10
第三个加密过程
按位取反
第四个加密过程
相乘*52
EXP
#include <stdio.h>
#include <string.h>
int main(void){
int enc1[100] = {0xE8, 0x80, 0x84, 0x08, 0x18, 0x3C, 0x78, 0x68, 0x00, 0x70,
0x7C, 0x94, 0xC8, 0xE0, 0x10, 0xEC, 0xB4, 0xAC, 0x68, 0xA8,
0x0C, 0x1C, 0x90, 0xCC, 0x54, 0x3C, 0x14, 0xDC, 0x30};
char enc2[20] = "NewStarCTF";
char flag[50];
int i, j;
for ( i = 0; i < 29; ++i){
for (j = 32; j < 127; j++){
int tmp = j;
if (j >= 'A' && j <= 'Z'){
j = (j - 'A' + 13) % 26 + 'A';
}
else if (j >= '0' && j <= '9'){
j = (j - '0' + 3) % 10 + '0';
}
else if (j >= 'a' && j <= 'z'){
j = (j - 'a' + 8) % 26 + 'a';
}
j += enc2[i % strlen(enc2)];
j = ~j;
j = (j*52)&0xff;
if (j == enc1[i]){
if ((tmp >= 'A' && tmp <= 'Z') ||(tmp >= 'a' && tmp <= 'z') ){
printf("%c", tmp);
}
}
j = tmp;
}
}
return 0;
}
编写exp运行
得到flag:BruteForceIsAGoodwaytoGetFlag
修补下flag
完整的flag:flag{BruteForceIsAGoodwaytoGetFlag}
提交
得分
思路及exp参考BUUCTF NewStarCTF 2023 Week2 Reverse方向wp_buuctf newstart2023 week2 reverse-CSDN博客