1.easyre
这道题非常的简单。先查壳,发现没有壳
直接拖入IDA分析,flag直接就出来了
2.reverse1
下载完成后,直接将文件拖入IDA分析,shift+F12查找看字符串
找到关键字flag,双击进入,ctrl+x查看
F5反编译成伪C代码
选中Str2,双击进入查看,发现flag格式的字符串{hello_world}
我们继续向下分析,发现在这段代码中对Str2进行了替换,分别选中111和48,按R键得到对应字符
发现是将字符串中的‘o’换成了‘0’.
替换后得到flag{hell0_w0rld}。
3.reverse2
下载好后,拖入exeinfope查看信息
之后直接拖入IDA分析,shift+F12看字符串
选中带有flag的字符串,双击进入
ctrl+X
在F5反编译成伪C代码
可以看到flag为关键字,并且进行了替换,双击flag进入分析
可以发现这里看到的并不完整,我们可以看hex字段
之后再回到伪C代码分析替换的部分
可以发现是将‘i’和‘r’替换为‘1’,找到的字符串较短,可以直接手动替换,但因为后面会有很多写脚本的来解,所以就看了一下别人的脚本,这就懒得自己写了:
代码来源:https://blog.csdn.net/xiao__1bai/article/details/119580352?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168457673116800184144450%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168457673116800184144450&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-1-119580352-null-null.142v87control_2,239v2insert_chatgpt&utm_term=buuctf%20reverse2&spm=1018.2226.3001.4187
flag="{hacking_for_fun}"
for i in range(len(flag)):
if((ord(flag[i])==105) or (ord(flag[i])==114)):
flag=flag.replace(flag[i],chr(49))
print(flag)
这是一个python脚本,也可以用其他的来写。
最后得出flag{{hack1ng_fo1_fun}
4.内涵的软件
一样的,先交给exeinfope查看信息,发现是32bit
然后用IDA32分析,shift+F12发现可疑字串
本来还准备反编译伪代码,结果把这个可疑字串直接输入就得到了flag{49d3c93df25caad81232130f3d2ebfad}
5.新年快乐
先交给exeinfope查看信息,是32位文件,发现是有壳的,提示我们用upx.exe -d脱壳
接下来进行脱壳,注意我这里将upx.exe 和题目文件放在一起了。也可以不放在一起,用绝对路径。
脱完壳后再用IDA进行分析,发现是将输入的Str1与Str2比较,相同就是正确的flag,然后Str2=“HappyNewYear!”。得出flag{HappyNewYear!}
6.xor
拖入IDA分析,发现了input your flag和一大堆可疑字串,猜测这些字串是加密的flag。
但其实这里卡了我很久,不知道怎么去做,后面还是去参考了一下大神博主的WP
参考地址:https://blog.csdn.net/weixin_44632787/article/details/119808950?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168465177516800213017703%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168465177516800213017703&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-119808950-null-null.142v87control_2,239v2insert_chatgpt&utm_term=buuctf%20reverse%20xor&spm=1018.2226.3001.4187
以下本题内容均为参考所得
从这里看出,我们要找的flag长度33
并且在进行检验flag之前会继续异或的操作
并且我们在前面找到了一大串的可以字符,大佬的WP告诉我这就是全球变量的值,我看不懂,所以就只能当作可疑字符串
然后是脚本,这里是python3的脚本,其中的16进制处理过的,对比以下就能看出是怎么处理的。
key = [ 'f',0xA,'k',0xC,'w','&','O','.','@',0x11,'x',0xD,'Z',';','U',0x11,'p',0x19,'F',0x1F,'v','"','M','#','D',0xE,'g',6,'h',0xF,'G','2','O' ]
flag = "f"
x = 0
for i in range(0,len(key)-1):
if isinstance(key[i],str):
if isinstance(key[i+1],str): x = ord(key[i]) ^ ord(key[i+1]) # key[i],key[i+1]同时为字符串
else: x = ord(key[i]) ^ key[i+1] # key[i]为字符串,key[i+1]为整数
else:
if isinstance(key[i+1],str): x = key[i] ^ ord(key[i+1]) # key[i]为整数,key[i+1]为字符串
else: x = key[i] ^ key[i+1] # key[i],key[i+1]同时为整数
flag = flag + chr(x)
print(flag)
最后就能得出结果flag{QianQiuWanDai_YiTongJiangHu}
7.helloword
下载好后我们可疑看出这是一个apk文件,我们直接用ApkIDE打开分析
直接可疑在文件夹中找到flag,一个一个看可能比较慢,我们可以通过上面工具栏,有查找与替换。
最终得到flag{7631a988259a00816deda84afb29430a}
8.reverse3
查壳,发现是32位程序
拖入,IDA分析。shift+F12查字串,发现可疑字符,并发现是base64加密
找到_main_0,F5反汇编成伪C代码分析。
双击Str2,查找,得到’e3nifIH9b_C@n@dH’,并且我们已经知道是base64加密,但这里明显不是base64,肯定通过了其他的手段加密。我们继续分析
发现在这里,对字符串进行了一个+的操作,我们写脚本将他跑出来
str = 'e3nifIH9b_C@n@dH'
flag = ''
for i in range(len(str)):
flag+=chr(ord(str[i])-i)
print(flag)
输出e2lfbDB2ZV95b3V9,把这个当作flag输出发现不对
之后再进行解码
得到最终结果{i_l0ve_you}
9.不一样的flag
按着套路走,查壳,32位文件
拖入IDA分析,具体按键操作就不再细讲了,相信大家都已经熟悉了,都是上面讲到过的操作。
根据语言的提示发现,这好像是一个迷宫,让我们走出迷宫。
1111
01000
01010
00010
1111#
猜测不是从开始到#,就是从#到*,继续往下分析。1234分别对应上下左右。
然后我们走一下这个迷宫“下下下右右上上右右下下下”,转换成1234得到flag
最终flag={222441144222}
10.SimpleRev
查壳
然后使用IDA分析
unsigned __int64 Decry()
{
char v1; // [rsp+Fh] [rbp-51h]
int v2; // [rsp+10h] [rbp-50h]
int v3; // [rsp+14h] [rbp-4Ch]
int i; // [rsp+18h] [rbp-48h]
int v5; // [rsp+1Ch] [rbp-44h]
char src[8]; // [rsp+20h] [rbp-40h] BYREF
__int64 v7; // [rsp+28h] [rbp-38h]
int v8; // [rsp+30h] [rbp-30h]
__int64 v9[2]; // [rsp+40h] [rbp-20h] BYREF
int v10; // [rsp+50h] [rbp-10h]
unsigned __int64 v11; // [rsp+58h] [rbp-8h]
v11 = __readfsqword(0x28u);
*(_QWORD *)src = 0x534C43444ELL;
v7 = 0LL;
v8 = 0;
v9[0] = 0x776F646168LL;
v9[1] = 0LL;
v10 = 0;
text = (char *)join(key3, v9);
strcpy(key, key1);
strcat(key, src);
v2 = 0;
v3 = 0;
getchar();
v5 = strlen(key);
for ( i = 0; i < v5; ++i )
{
if ( key[v3 % v5] > 64 && key[v3 % v5] <= 90 )
key[i] = key[v3 % v5] + 32;
++v3;
}
printf("Please input your flag:");
while ( 1 )
{
v1 = getchar();
if ( v1 == 10 )
break;
if ( v1 == 32 )
{
++v2;
}
else
{
if ( v1 <= 96 || v1 > 122 )
{
if ( v1 > 64 && v1 <= 90 )
{
str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;
++v3;
}
}
else
{
str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;
++v3;
}
if ( !(v3 % v5) )
putchar(32);
++v2;
}
}
if ( !strcmp(text, str2) )
puts("Congratulation!\n");
else
puts("Try again!\n");
return __readfsqword(0x28u) ^ v11;
}
R键后得到,这里要特别注意,IDA得出的是大端序排列的,而正常情况下是小端序排列的,这我们需要进行首位调换才是真的。
*(_QWORD *)src = 'SLCDN';
v9[0] = 'wodah';
而后继续向下分析,这里发现text是将key3和v9拼接起来,双击key3可以看到key3=‘kills’
就可以得到text,下面是将key1的值复制给key。然后将src拼接到key当中,得到新的key。
这样我们也能得到key的值。
text = (char *)join(key3, v9);
strcpy(key, key1);
strcat(key, src);
#include<stdio.h>
#include<cstring>
int main(){
char text[]="killshadow";
char key[]="ADSFKNDCLS";
char flag[]="";
int v5=strlen(key);
int v3=0;
for ( int i = 0; i < v5; ++i ){
if ( key[v3 % v5] > 64 && key[v3 % v5] <= 90 )
key[i] = key[v3 % v5] + 32;
++v3;
}
for(int i=0;i<strlen(text);i++){
for(int j=0;;j++){
flag[i]=text[i]-97+26*j+39-97+key[i];
if(flag[i]>=65&&flag[i]<91)
break;
}
}
for(int i=0;i<10;i++){
printf("%c",flag[i]);
}
return 0;
}
最后得出**flag{KLDQCUDFZO} **