攻防世界 reverse新手题 logmein

logmein

下载文件,改为exe后缀,查看一下,ELF文件,64位
在这里插入图片描述
64位ida打开,找到main函数,F5查看伪代码

  v9 = 0;
  strcpy(v8, ":\"AL_RT^L*.?+6/46");
  v7 = 'ebmarah';
  v6 = 7;
  printf("Welcome to the RC3 secure password guesser.\n", a2, a3);
  printf("To continue, you must enter the correct password.\n");
  printf("Enter your guess: ");
  __isoc99_scanf("%32s", s);
  v3 = strlen(s);
  if ( v3 < strlen(v8) )
    sub_4007C0();
  for ( i = 0; i < strlen(s); ++i )
  {
    if ( i >= strlen(v8) )
      sub_4007C0();
    if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )
      sub_4007C0();
  }
  sub_4007F0();
}

sub_4007F0()的地址都是输出Incorrect password!
所以从条件中找flag

 if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )
      sub_4007C0();

说明正确的应该是s[i] = (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i])
转换位Python

a = ":\"AL_RT^L*.?+6/46"
b = "harambe"
c = 7
flag = ''

for i in range(0,len(a)):
    flag += chr(ord(b[i%c]) ^ord(a[i]))
print(flag)

第一个if,大于v8的长度错误
第二个if,小于等于错误,所以字符串长度flag=v8
b=harambe是因为小端储存,所以翻转
小端储存:即最低地址存放的最低字节,一个用十六进制表示的32位数据:12345678H,存放在存储字长是32位的存储单元中,按低字节到高字节的存储顺序为0x78、0x56、0x34和0x12。整个存储字从低字节到高字节读出的结果就是:78563412H,为Intel x86 系列等采用
程序运行结果:
在这里插入图片描述

RC3-2016-XORISGUD

猜你喜欢

转载自blog.csdn.net/weixin_45759668/article/details/107739878