[NewStarCTF 2023 公开赛道]easy_enc

下载题目

国际惯例先查壳

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博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值