C编程字节数据类型

C编程字节数据类型,c,encoding,byte,decoding,C,Encoding,Byte,Decoding,我正在做一个ctf,我已经反转了和elf文件,找到了编码标志的函数,我制作了一个解码器,但是因为它是c语言,所以我不能使用字节数据类型。是否有我可以添加的库,如果没有,这段代码是如何使用字节数据类型的。我曾经对作者做过一些挑战,我通过在c中定义来解决这个问题,我认为这就是所谓的动态字符串转换 // the original encoder undefined8 main(void) { int iVar1; ssize_t sVar2; long in_FS_OFFSET;

我正在做一个ctf,我已经反转了和elf文件,找到了编码标志的函数,我制作了一个解码器,但是因为它是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;
}

//原始编码器
未定义的8干管(无效)
{
int iVar1;
ssize_t sVar2;
长in_FS_偏移量;
int local_40;
字节本地_38[40];
本地长10;
本地_10=*(长*)(在_FS_偏移量+0x28中);
初始化_标志();
放(“给我你的密码:”);
sVar2=读取(0,本地_38,0x1f);
局部_38[(int)sVar2+-1]=0;
局部_40=0x28;
而(本地_40<(int)sVar2+-1){
local_38[local_40]=local_38[local_40]^(char)local_40+10U;
本地_38[local_40]=本地_38[local_40]-2;
局部_40=局部_40+1;
}

iVar1=strcmp((char*)local_38,“lp`7a这些评论已经为您提供了两个很好的答案(使用stdint.h或chars),但除此之外

  • 如果您无法访问stdint头并且不想使用字符,那么Boost之类的库也可以为您提供uint8_t数据类型

  • > P> C++中,你有STD::字节可访问(不确定你,特别是,将有帮助,但其他人可能)

如果要确保字符长度为8位,可以检查中定义的字符位值

因此,您的选择(从最好到最差的排名)是:

  • (如果可以使用cpp)使用std::byte
  • 使用
  • 使用字符/无符号字符
  • 使用外部库
  • 请注意,除非您已经拥有了所述库,否则使用外部库来完成这样一项琐碎的任务可能会有些过分


    希望这有帮助。

    您的解码器似乎有一些错误,如: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)
    

    key=”Lp’7AYE可以<代码> Type无符号char字节;<代码> >除非你想要它>代码>符号char < /> >或默认值 char < /C> >在 Stdit.H./Cube >中你会发现像“代码> UTI8GYT ”这样的问题被标记为“C”,所以我会把C++方面的答案丢弃。虽然这个解码器不起作用,但经过修改,我仍然需要字节类型。为了帮助我解决这个问题,我一直在基于动态密钥生成
    
    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)