【BUUCTF】 Re刷题记录

[ACTF新生赛2020]easyre1

放入ida,一眼 UPX 壳

先脱壳,脱壳后主函数内容如下:

屏幕截图 2025-11-16 114525

修改一下函数名。

屏幕截图 2025-11-16 114701

一步一步分析,a 被初始化为

*F'\"N,\"(I?+@

然后输入 v6 ,可以看出flag构成为:ACTF{}

之后v6数组就查无此人了,a也不像flag,打开s数组,发现s数组
屏幕截图 2025-11-16 115229

s 数组存的也不是flag,合理猜测 f 数组存放flag。

这个 if 判断应该就是检验 flag 的地方了。

把 f 数组里的值作为下标,判断两值相等。

上脚本(C++):

#include<bits/stdc++.h>
using namespace std;
const char a[]={"*F'\"N,\"(I?+@"};
const char ch[]={"~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(',27h,'&%$# !"};
signed main() {
	for (int i=0;i<=11;++i) {
		for (int j=0;j<strlen(ch);++j){
			if (a[i]==ch[j]) {
				cout<<(char)(j+2);
			}
 		}
	}
	return 0;
}

注意,数组 s 开头的这个 db 7Eh 也是 s 里的内容,别漏了。

屏幕截图 2025-11-16 120140

得到 flag 里的内容:

U9X^1SY]W6@T?

原本的flag应该是 ACTF{U9X^1SY]W6@T?} ,但这里是BUUCTF,应该改成

flag{U9X^1SY]W6@T?} (因为这个原因被卡了好久)。

复盘发现 v7、v8、v9 的地址和 v6 是连续的,而这三个值又都赋给了 f ,可以佐证 f 里存的就是 flag 。

[ACTF新生赛2020]rome1

水题+1

直接扔 ida 里就能见到加密函数

开头的几个 if 判断内容是 ACTF

屏幕截图 2025-11-22 222727

加密只是判断大小写字母然后进行移位。

if ( *((char *)v1 + i) > 64 && *((char *)v1 + i) <= 90 )
   *((_BYTE *)v1 + i) = (*((char *)v1 + i) - 51) % 26 + 65;
if ( *((char *)v1 + i) > 96 && *((char *)v1 + i) <= 122 )
   *((_BYTE *)v1 + i) = (*((char *)v1 + i) - 79) % 26 + 97;

大写字母加密公式是 (x - 51) % 26 + 65 ,向后偏移 14 位。(可以直接带入法)

小写字母加密公式是 (x - 79) % 26 + 97 ,向后偏移 18 位。

考虑到取模运算不好逆向,可以直接暴力枚举。

脚本如下:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const char s[]={"Qsw3sj_lz4_Ujw@l"}; 
signed main(){
	int len=strlen(s);
	for (int i=0;i<len;++i) {
		for (int j=32;j<=126;++j) {
			char f=char(j); 
			if (j>=64 && j<=90) {
				f=(j-51)%26+65; 
			} 
			else if (j>96&&j<=122) {
				f=(j-79)%26+97; 
			}
			if (f==s[i]) {
				cout<<char(j); break;
			}
		}
	} 
	return 0;
} 
posted @ 2025-11-16 12:07  int_Hello_world  阅读(22)  评论(0)    收藏  举报