buu-re-SimpleRev

"本文详细介绍了对一个64位无壳程序的分析过程,通过ida转换伪代码找到关键函数,并理解代码逻辑。代码段主要针对A-Z和a-z字母进行特定操作,构造了一个解密算法。作者通过绘制图表辅助理解,并编写了爆破脚本来破解该算法,最终得到flag{KLDQCUDFZO}
摘要由CSDN通过智能技术生成

要点:

  • 小端序存储
  • 爆破脚本编写

 分析:

将文件拖入exeinfope,64位无壳。

 拖入ida转换伪代码发现关键函数。

 跟进后,分析函数。

 以上代码段分析见上图注释。

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;
}

 到这里后,要仔细耐心分析代码及其执行过程。为此我在纸上画图来表示。

 所以分析得知,上段代码主要对A-Z,a-z字母进行操作:

str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;

 知道代码逻辑后,编写爆破脚本。

text='killshadow'
key='ADSFKNDCLS'
loop='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
flag=''
s=''
v3=0
v2=0
v5=len(key)

for i in range(0,v5):
    if ( key[v3 % v5] > '@' and key[v3 % v5] <= 'Z' ):
      s += chr(ord(key[i])+32)
print(s)

for i in range(0,len(text)):
  for j in loop:
    if ord(text[i]) == (ord(j)-39-ord(s[i])+97)%26+97:
      flag += j
print(flag)

运行脚本。

 下面的即是flag。

flag{KLDQCUDFZO}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值