【BUUCTF】simpleRev WP

[BUUCTF]simpleRev

放入IDE中,找到main函数

查看伪代码
在这里插入图片描述
发现主要函数为Decry(),点击进入

进入Decry()函数

在这里插入图片描述

分析函数

 *(_QWORD *)src = 357761762382LL;
  v7 = 0LL;
  v8 = 0;
  v9 = 512969957736LL;
  v10 = 0LL;
  v11 = 0;
  text = (char *)join(key3, &v9);
  strcpy(key, key1);
  strcat(key, src);
  v2 = 0;
  v3 = 0;

主要是一些变量的赋值,关键在于src和v9这两个变量,我这里显示的是数字,可以按R来显示实际赋的值
在这里插入图片描述
src =‘SLCDN’
v9=‘wodah’
还需要注意的是,x86cpu中存储是小端存储,因此,实际存储的应该是倒过来的

text = (char *)join(key3, &v9);
strcpy(key, key1);
strcat(key, src);

text是用连接函数连接出来的,key3可以看到是kills,于是,text=‘killshadow’
在这里插入图片描述
src是用复制和连接函数生成的,src=‘ADSFKNDCLS’
在这里插入图片描述

for ( i = 0; i < v5; ++i )
  {
    if ( key[v3 % v5] > 64 && key[v3 % v5] <= 90 )
      key[i] = key[v3 % v5] + 32;
    ++v3;
  }

这个循环的作用就是将key数组中ASCII码在64和90之间的字符都加32,实际上就是把key数组中的大写字母全部变成小写字母

key= 'ADSFKNDCLS'
v3=0
v5=len(key)
for i in range(v5):
    if (ord(key[v3%v5])> 64 and ord(key[v3%v5])<=90):
        
        print(chr(ord(key[v3 % v5])+32),end='')

    v3+=1

因此现在key数组现在是’adsfkndcls‘

while ( 1 )
  {
    v1 = getchar();
    if ( v1 == '\n' )
      break;
    if ( v1 == ' ' )
    {
      ++v2;
    }
    else
    {
      if ( v1 <= '`' || v1 > 'z' )
      {
        if ( v1 > '@' && v1 <= 'Z' )
          str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
      }
      else
      {
        str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
      }
      if ( !(v3 % v5) )
        putchar(32);
      ++v2;
    }
  }

这一段是对flag的处理,flag用v1数组进行保存遇到回车键就结束,通过查看ASIIC码表可以看出,flag只能是字母组成。将输入的字母进行处理后放入str2数组中

 if ( !strcmp(text, str2) )
    puts("Congratulation!\n");

若str2和之前的text相同,就说明我们的flag正确。

求flag

我们可以用暴力破解的方法,将每一个字母都带入处理的式子中,并将结果与text中的进行对比,找到使结果成立的字母
脚本如下

key = 'adsfkndcls'
flag =''
text = 'killshadow'
for i in range(len(text)):
	for x in range(65,123):
		if text[i] == chr((x-39-ord(key[i]) + 97) % 26 +97):
			flag= flag+chr(x)
			break
print('flag{'+flag+'}')
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值