攻防世界-RE-logmein

攻防世界-RE-logmein

先用Exeinfo查壳

显示为ELF文件,没有加壳(一个简单题)。如果加壳了就需要先脱壳。

放到IDA中查看代码

void __fastcall __noreturn main(int a1, char **a2, char **a3)
{
  size_t v3; // rsi
  int i; // [rsp+3Ch] [rbp-54h]
  char s[36]; // [rsp+40h] [rbp-50h] BYREF
  int v6; // [rsp+64h] [rbp-2Ch]
  __int64 v7; // [rsp+68h] [rbp-28h]
  char v8[28]; // [rsp+70h] [rbp-20h] BYREF
  int v9; // [rsp+8Ch] [rbp-4h]

  v9 = 0;
  strcpy(v8, ":\"AL_RT^L*.?+6/46");
  v7 = 'ebmarah';
  v6 = 7;
  printf("Welcome to the RC3 secure password guesser.\n");
  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_4007c0是打印错误语句的函数,sub_4007F0()是输入正确。

v7 = 0x65626D61726168LL;需要转换成对应的字符串,而且由于是小端存储v7 = 'ebmarah';是错误的,需要反向一下!!。
这里讲一下,对于字符串,下标小的存储在低地址,如v7中下标为0的68,对应字符‘h’应该在最前面。
if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )是关键代码,写个C程序打印出来就好了。

        char*v8=":\"AL_RT^L*.?+6/46";
	char*v7="harambe";
	char*output=(char*)malloc(sizeof(char)*19);
	int i;
	for(i=0;i<17;i++){
		output[i]=v8[i]^v7[i%7];	
	} 
	output[17]='\0';
	printf("%s\n",output);

最后可以放到Linux下跑一下试试。

posted @ 2021-04-27 10:46  ddddd1234654732  阅读(132)  评论(0)    收藏  举报
Live2D