неправильный пользователь и пароль в C коде обратного инжиниринга - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть этот фрагмент кода из двоичного файла, который запрашивает имя пользователя и пароль, мне удалось найти пользователя "mari" и пароль "luig", но там указано неправильное имя пользователя. Вот код:

undefined8 main(void)
{
  int iVar1;
  undefined4 local_96;
  undefined2 local_92;
  undefined local_90;
  undefined4 local_8f;
  undefined2 local_8b;
  undefined local_89;
  char local_88 [64];
  char local_48 [64];

  local_8f = 0x6769756c;
  local_8b = 0x3169;
  local_89 = 0;
  local_96 = 0x6972616d;
  local_92 = 0x316f;
  local_90 = 0;
  printf("enter username :");
  __isoc99_scanf(&DAT_00102019,local_48);
  iVar1 = strcmp(local_48,(char *)&local_96);
  if (iVar1 == 0) {
    printf("enter password :");
    __isoc99_scanf(&DAT_00102019,local_88);
    iVar1 = strcmp(local_88,(char *)&local_8f);
    if (iVar1 == 0) {
      printf("welldone use it to submit the flag :D");
    }
    else {
      printf("wrong password");
    }
  }
  else {
    printf("wrong username");
  }
  return 0;
}

почему «mari» как пользователь и «luig» как пароль не работает?

1 Ответ

0 голосов
/ 25 апреля 2020

Имя пользователя и пароль для сравнения хранятся в целочисленных переменных в шестнадцатеричном виде:

  local_8f = 0x6769756c;  // 4 byte variable: g i u l
  local_8b = 0x3169;      // 2 byte variable: 1 i
  local_89 = 0;           // 1 byte variable: \0

  local_96 = 0x6972616d;  // 4 byte variable: i r a m
  local_92 = 0x316f;      // 2 byte variable: 1 o
  local_90 = 0;           // 1 byte variable: \0

Эти переменные хранятся в памяти с обращенными байтами.

Таким образом, переменная local_8f когда интерпретируется как строка в памяти, фактически читает luigi1\0, а переменная local_96, когда интерпретируется как строка в памяти, фактически читает mario1\0. И это те uid / pwd, которые вы должны ввести.

...