C тип данных байта программирования - PullRequest
0 голосов
/ 30 марта 2020

Я делаю ctf, я перевернул файл elf и нашел функцию, которая кодирует флаг, и я сделал декодер, но, поскольку он находится в c, я не могу использовать тип данных байта. Есть ли библиотека, которую я могу добавить, и если нет, то как этот код использовал тип данных байта. Я уже сделал несколько попыток этого автора, и я решил эту проблему, отменив in c, и я думаю, что это что-то, называемое динамическим c преобразованием строки.


// the original encoder
undefined8 main(void)

{
  int iVar1;
  ssize_t sVar2;
  long in_FS_OFFSET;
  int local_40;
  byte local_38 [40];
  long local_10;

  local_10 = *(long *)(in_FS_OFFSET + 0x28);
  initialize_flag();
  puts("Give me your password: ");
  sVar2 = read(0,local_38,0x1f);
  local_38[(int)sVar2 + -1] = 0;
  local_40 = 0x28;
  while (local_40 < (int)sVar2 + -1) {
    local_38[local_40] = local_38[local_40] ^ (char)local_40 + 10U;
    local_38[local_40] = local_38[local_40] - 2;
    local_40 = local_40 + 1;
  }
  iVar1 = strcmp((char *)local_38,"lp`7a<qLw\x1ekHopt(f-f*,o}V\x0f\x15J");
  if (iVar1 == 0) {
    puts("Thats the right password!");
    printf("Flag: %s",flagBuffer);
  }
  else {
    puts("Thats not the password!");
  }
  if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return 0;
}

Вот мой кодировщик:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


int main()
{
  ssize_t sVar2;
  int local_40;
  byte local_38 [40];




  sVar2 = read(0,local_38,0x1f);

  local_38[(int)sVar2 + -1] = 0;

  local_40 = 27;// the flag lenght is 27
  while (local_40 > 0) {
//this is the reverse of the og encoding
    local_40 = local_40 - 1;
   local_38[local_40] = local_38[local_40] - 2;
    local_38[local_40] = (local_38[local_40] ^ (char)local_40) - 10U;
  }

 puts(local_38);    


  return 0;  


}


//lp`7a<qLw\x1ekHopt(f-f*,o}V\x0f\x15J this is the encoded flag
// s after the original encoding should be w


Ответы [ 2 ]

1 голос
/ 30 марта 2020

Комментарии уже дали вам два отличных ответа (Использование stdint.h или chars), но в остальном ...

  • Если у вас нет доступа к заголовку stdint и вы делаете Если вы не хотите использовать символы, библиотеки, такие как Boost, также могут предоставить вам тип данных uint8_t.

  • В C ++ у вас есть доступный std :: byte (Не уверен, что вы, в частности, будете помогло это, но другие могут быть)

Если вы хотите sh, чтобы убедиться, что char имеет длину 8 битов, вы можете проверить значение CHAR_BIT, определенное в.

Итак, ваши варианты (ранжирование от лучшего к худшему):

  1. (если вы можете использовать cpp) Использование std :: byte
  2. Использование типа данных uint8_t определено в <stdint.h>
  3. Использование char / unsigned char
  4. Использование внешней библиотеки

Обратите внимание, что использование внешней библиотеки для такой тривиальной задачи, вероятно, излишне у вас уже есть эта библиотека.

Надеюсь, это поможет.

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

кажется, что ваш декодер имеет некоторые ошибки, такие как: local_38 [local_40] = local_38 [local_40] - 2;

Должно быть так: local_38 [local_40] = local_38 [local_40] + 2;

Я написал декодер для вышеуказанного вопроса в python

key="lp`7a<qLw\x1ekHopt(f-f*,o}V\x0f\x15J"
check=list(key)
string=str()
string=''
for i in range(26,-1,-1):
    j=i+10
    k=(ord(check[i])+2)
    string=(chr(k^j)+string)
print(string)

Надеюсь, это поможет

...