BUUCTF reverse1-10

1.easyre

这道题非常的简单。先查壳,发现没有壳
image.png
直接拖入IDA分析,flag直接就出来了
image.png

2.reverse1

下载完成后,直接将文件拖入IDA分析,shift+F12查找看字符串
image.png
找到关键字flag,双击进入,ctrl+x查看
image.pngimage.png
F5反编译成伪C代码
image.png
选中Str2,双击进入查看,发现flag格式的字符串{hello_world}
image.png
我们继续向下分析,发现在这段代码中对Str2进行了替换,分别选中111和48,按R键得到对应字符
image.png
image.png
发现是将字符串中的‘o’换成了‘0’.
替换后得到flag{hell0_w0rld}。

3.reverse2

下载好后,拖入exeinfope查看信息
image.png
之后直接拖入IDA分析,shift+F12看字符串
image.png
选中带有flag的字符串,双击进入
image.png
ctrl+X
image.png
在F5反编译成伪C代码
image.png
可以看到flag为关键字,并且进行了替换,双击flag进入分析
image.png
可以发现这里看到的并不完整,我们可以看hex字段
image.png
之后再回到伪C代码分析替换的部分
image.png
image.png
可以发现是将‘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
image.png
然后用IDA32分析,shift+F12发现可疑字串
image.png
image.png
本来还准备反编译伪代码,结果把这个可疑字串直接输入就得到了flag{49d3c93df25caad81232130f3d2ebfad}

5.新年快乐

先交给exeinfope查看信息,是32位文件,发现是有壳的,提示我们用upx.exe -d脱壳
image.png
接下来进行脱壳,注意我这里将upx.exe 和题目文件放在一起了。也可以不放在一起,用绝对路径。
image.png
脱完壳后再用IDA进行分析,发现是将输入的Str1与Str2比较,相同就是正确的flag,然后Str2=“HappyNewYear!”。得出flag{HappyNewYear!}
image.png

6.xor

拖入IDA分析,发现了input your flag和一大堆可疑字串,猜测这些字串是加密的flag。
image.png
但其实这里卡了我很久,不知道怎么去做,后面还是去参考了一下大神博主的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
image.png
并且在进行检验flag之前会继续异或的操作
image.png
并且我们在前面找到了一大串的可以字符,大佬的WP告诉我这就是全球变量的值,我看不懂,所以就只能当作可疑字符串
image.png
然后是脚本,这里是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打开分析
image.pngimage.png
直接可疑在文件夹中找到flag,一个一个看可能比较慢,我们可以通过上面工具栏,有查找与替换。
image.pngimage.png
最终得到flag{7631a988259a00816deda84afb29430a}

8.reverse3

查壳,发现是32位程序
image.png
拖入,IDA分析。shift+F12查字串,发现可疑字符,并发现是base64加密
image.png
image.png
找到_main_0,F5反汇编成伪C代码分析。
image.png
双击Str2,查找,得到’e3nifIH9b_C@n@dH’,并且我们已经知道是base64加密,但这里明显不是base64,肯定通过了其他的手段加密。我们继续分析
image.png
发现在这里,对字符串进行了一个+的操作,我们写脚本将他跑出来
image.png

str = 'e3nifIH9b_C@n@dH'
flag = ''
for i in range(len(str)):
    flag+=chr(ord(str[i])-i)
print(flag)

输出e2lfbDB2ZV95b3V9,把这个当作flag输出发现不对
之后再进行解码
image.png得到最终结果{i_l0ve_you}

9.不一样的flag

按着套路走,查壳,32位文件
image.png
拖入IDA分析,具体按键操作就不再细讲了,相信大家都已经熟悉了,都是上面讲到过的操作。
根据语言的提示发现,这好像是一个迷宫,让我们走出迷宫。
1111
01000
01010
00010
1111#
猜测不是从
开始到#,就是从#到*,继续往下分析。1234分别对应上下左右。
image.png
然后我们走一下这个迷宫“下下下右右上上右右下下下”,转换成1234得到flag
最终flag={222441144222}

10.SimpleRev

查壳
image.png
然后使用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);

然后写脚本解出flag。这里脚本我就没有自己写了
脚本来源:https://blog.csdn.net/weixin_43252204/article/details/108647472?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168465620616800222815694%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168465620616800222815694&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-108647472-null-null.142v87control_2,239v2insert_chatgpt&utm_term=buuctf%20reverse%20simplerev&spm=1018.2226.3001.4187

#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} **

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值