欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

攻防世界 reverse新手题 logmein

程序员文章站 2024-03-11 22:11:13
...

logmein

下载文件,改为exe后缀,查看一下,ELF文件,64位
攻防世界 reverse新手题 logmein
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 系列等采用
程序运行结果:
攻防世界 reverse新手题 logmein

RC3-2016-XORISGUD