buu-re-SimpleRev

要点:

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

 分析:

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

buu-re-SimpleRev

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

buu-re-SimpleRev

 跟进后,分析函数。

buu-re-SimpleRev

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

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

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

buu-re-SimpleRev

 所以分析得知,上段代码主要对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)

运行脚本。

buu-re-SimpleRev

 下面的即是flag。

flag{KLDQCUDFZO}

上一篇:浅析Python垃圾回收机制


下一篇:Vue编译提示警告