首页
论坛
专栏
课程

[原创] 第六题:消失的岛屿

2019-6-21 11:55 259

[原创] 第六题:消失的岛屿

2019-6-21 11:55
259

使用IDA查看main函数,F5

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // eax
  uint8_t bindata; // [esp+11h] [ebp-3Fh]
  const char *v6; // [esp+48h] [ebp-8h]
  char *v7; // [esp+4Ch] [ebp-4h]

  __main();
  printf("please enter Serial:");
  scanf(" %s", &bindata);
  if ( strlen((const char *)&bindata) > 49 )
    puts("error");
  v7 = (char *)calloc(1u, 0x400u);
  v3 = strlen((const char *)&bindata);
  base64_encode(&bindata, v7, v3);
  v6 = "!NGV%,$h1f4S3%2P(hkQ94==";
  if ( !strcmp("!NGV%,$h1f4S3%2P(hkQ94==", v7) )
    puts("Success");
  else
    puts("Please Try Again");
  free(v7);
  system("pause");
  return 0;
}

看到函数名字base64_encode多半是base64编码,并且"!NGV%,$h1f4S3%2P(hkQ94=="字符串以==结尾,长度为24,是4的倍数。不过"!NGV%,$h1f4S3%2P(hkQ94=="出现了奇怪的字符,那么可能是标准base64的变形。

 

在base64_encode函数中随即发现charEncrypt函数

char __cdecl charEncrypt(int data)
{
  int dataa; // [esp+18h] [ebp+8h]

  dataa = aTuvwxtulmnopqr[data];
  //'tuvwxTUlmnopqrs7YZabcdefghij8yz0123456VWXkABCDEFGHIJKLMNOPQRS9+/'
  if ( dataa > 64 && dataa <= 90 )
    return -101 - dataa;
  if ( dataa > 96 && dataa <= 122 )
    return dataa - 64;
  if ( dataa > 47 && dataa <= 57 )
    return dataa + 50;
  if ( dataa == 43 )
    return 119;
  if ( dataa == 47 )
    dataa = 121;
  return dataa;
}

'tuvw‘显然不是真实的base64字符表,charEncrypt函数相当于是对真实的字符表做了混淆。可以得到真实的表如下。

45678GF,-./0123iBA!"#$%&'()*j9:bcdefghEDC+ZYXWVUTSRQPONMLKJIHkwy

猜想本程序只是修改了base64的字符表,并没有对编码算法做出修改。而这种变形的base64相当于标准base64编码加简单替换。逆过程为简单替换加标准base64解码。

 

标准base64字符表如下。

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

将"!NGV%,$h1f4S3%2P(hkQ94=="替换得到"S2FuWHVlMjAxOWN0Zl9zdA==",解码得到KanXue2019ctf_st成功。



[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最后于 2019-6-21 13:18 被alaaal编辑 ,原因:
最新回复 (0)
游客
登录 | 注册 方可回帖
返回