首页
社区
课程
招聘
[原创]第六题:消失的岛屿
发表于: 2019-6-11 21:58 5058

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

htg 活跃值
4
2019-6-11 21:58
5058

使用IDA分析:

基本上是一个改造的base64算法的比较。
int __cdecl main(int argc, const char **argv, const char **envp)
{
  int inputStrLen; // eax
  uint8_t inputStr; // [esp+11h] [ebp-3Fh]
  const char *v6; // [esp+48h] [ebp-8h]
  char *base64Str; // [esp+4Ch] [ebp-4h]

  __main();
  printf("please enter Serial:");
  scanf(" %s", &inputStr);
  if ( strlen((const char *)&inputStr) > 0x31 ) // 长度>0x31
    puts("error");
  base64Str = (char *)calloc(1u, 0x400u);
  inputStrLen = strlen((const char *)&inputStr);
  base64_encode(&inputStr, base64Str, inputStrLen);
  v6 = "!NGV%,$h1f4S3%2P(hkQ94==";
  if ( !strcmp("!NGV%,$h1f4S3%2P(hkQ94==", base64Str) )
    puts("Success");
  else
    puts("Please Try Again");
  free(base64Str);
  system("pause");
  return 0;
}
关键在  base64_encode(&inputStr, base64Str, inputStrLen);
int __cdecl main(int argc, const char **argv, const char **envp)
{
  int inputStrLen; // eax
  uint8_t inputStr; // [esp+11h] [ebp-3Fh]
  const char *v6; // [esp+48h] [ebp-8h]
  char *base64Str; // [esp+4Ch] [ebp-4h]

  __main();
  printf("please enter Serial:");
  scanf(" %s", &inputStr);
  if ( strlen((const char *)&inputStr) > 0x31 ) // 长度>0x31
    puts("error");
  base64Str = (char *)calloc(1u, 0x400u);
  inputStrLen = strlen((const char *)&inputStr);
  base64_encode(&inputStr, base64Str, inputStrLen);
  v6 = "!NGV%,$h1f4S3%2P(hkQ94==";
  if ( !strcmp("!NGV%,$h1f4S3%2P(hkQ94==", base64Str) )
    puts("Success");
  else
    puts("Please Try Again");
  free(base64Str);
  system("pause");
  return 0;
}
关键在  base64_encode(&inputStr, base64Str, inputStrLen);

深入进去,有一个char __cdecl charEncrypt(int data)
char __cdecl charEncrypt(int data)
{
  int dataa; // [esp+18h] [ebp+8h]

  dataa = aTuvwxtulmnopqr[data];                // tuvwxTUlmnopqrs7YZabcdefghij8yz0123456VWXkABCDEFGHIJKLMNOPQRS9+/
  if ( dataa > '@' && dataa <= 'Z' )            // 大写字母:0x9B-'字符'=>大写字母倒序(A->Z;Z->A)
    return 0x9B - dataa;
  if ( dataa > '`' && dataa <= 'z' )            // 小写字母:'字符'-0x40=>小写字母后移0x40:(a->!,z->:)
    return dataa - 0x40;
  if ( dataa > '/' && dataa <= '9' )            // 数字:(0->b;9->k)
    return dataa + 0x32;
  if ( dataa == '+' )                           // +直接替换为W
    return 'w';
  if ( dataa == '/' )                           // /直接替换为y
    dataa = 'y';
  return dataa;
}
可知起就是一个移位算法。
现在基本上能够判断是一个改造的base64算法。分析算法费劲,可以借助IDA调试,找到对应关系
软件内置的base64是!NGV%,$h1f4S3%2P(hkQ94==
可以判断输入字符的长度为16个字节(可以借助在线base64算法分析验证)
我们构造一些输入字符、正常base64、软件改造base64,能够找到对应关系

AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLbauytjc345678
QUFBQkJCQ0NDRERERUVFRkZGR0dHSEhISUlJSkpKS0tLTExMYmF1eXRqYzM0NTY3OA==
B#G5Bg.6BP27A8A8A#$GAg(FAP9,!8d-!#h.!g+/!PW0"8S1'EGO:&AZ'Q1P2"'M34==


aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnno345678
YWFhYmJiY2NjZGRkZWVlZmZmZ2dnaGhoaWlpampqa2trbGxsbW1tbm5ubzM0NTY3OA==
'%Gd'E.e'N2f(FAg(%$h(E(E(N9D)FdC)%h+)E+Z)NWY*FSX*%OW*EKV*Q1P2"'M34==

!@#$%^&*()qwertyuiopasdfghjklXCVBNM":?<>}_+345678
IUAjJCVeJiooKXF3ZXJ0eXVpb3Bhc2RmZ2hqa2xYQ1ZCTk0iOj88Pn1fKzM0NTY3OA==
-#4f.6$:.eCC/&GM(&.P:&$+*M5djNAE(NdZ)NS'BO(6"gPe3fHHiDOb/Q1P2"'M34==

:/@://;&"}{}**+=-``/~9//2222222000n./lk;00M0-9-0-
Oi9AOi8vOyYifXt9KiorPS1gYC9+OS8vMjIyMjIyMjAwMG4uL2xrOzAwTTAtOS0wLQ==
3ek43eHU3R'eb&Wk/eCYi!Oc'6kw3!HU1f-R1f-R1f4T1FLV0NSY3Q4T""4W3!PT0B==


kl;aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnno345
a2w7YWFhYmJiY2NjZGRkZWVlZmZmZ2dnaGhoaWlpampqa2trbGxsbW1tbm5ubzM0NQ==
)NTI'%Gd'E.e'N2f(FAg(%$h(E(E(N9D)FdC)%h+)E+Z)NWY*FSX*%OW*EKV*Q1P2B==

kl:aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnno345
a2w6YWFhYmJiY2NjZGRkZWVlZmZmZ2dnaGhoaWlpampqa2trbGxsbW1tbm5ubzM0NQ==
)NTJ'%Gd'E.e'N2f(FAg(%$h(E(E(N9D)FdC)%h+)E+Z)NWY*FSX*%OW*EKV*Q1P2B==

借助Excel工具,就能找到对应关系。

仍然借助excel工具,找到 !NGV%,$h1f4S3%2P(hkQ94==对应正常的base64为S2FuWHVlMjAxOWN0Zl9zdA==

S2FuWHVlMjAxOWN0Zl9zdA== 通过正常的base64解密为KanXue2019ctf_st

答案:KanXue2019ctf_st
也可以分析里面的移位算法,找出逆算法,也能解密,但需要时间。
char __cdecl charEncrypt(int data)
{
  int dataa; // [esp+18h] [ebp+8h]

  dataa = aTuvwxtulmnopqr[data];                // tuvwxTUlmnopqrs7YZabcdefghij8yz0123456VWXkABCDEFGHIJKLMNOPQRS9+/
  if ( dataa > '@' && dataa <= 'Z' )            // 大写字母:0x9B-'字符'=>大写字母倒序(A->Z;Z->A)
    return 0x9B - dataa;
  if ( dataa > '`' && dataa <= 'z' )            // 小写字母:'字符'-0x40=>小写字母后移0x40:(a->!,z->:)
    return dataa - 0x40;
  if ( dataa > '/' && dataa <= '9' )            // 数字:(0->b;9->k)
    return dataa + 0x32;
  if ( dataa == '+' )                           // +直接替换为W
    return 'w';
  if ( dataa == '/' )                           // /直接替换为y
    dataa = 'y';
  return dataa;
}
可知起就是一个移位算法。
现在基本上能够判断是一个改造的base64算法。分析算法费劲,可以借助IDA调试,找到对应关系
软件内置的base64是!NGV%,$h1f4S3%2P(hkQ94==
可以判断输入字符的长度为16个字节(可以借助在线base64算法分析验证)
我们构造一些输入字符、正常base64、软件改造base64,能够找到对应关系


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 2
支持
分享
最新回复 (3)
雪    币: 5568
活跃值: (3208)
能力值: ( LV12,RANK:407 )
在线值:
发帖
回帖
粉丝
2
关键还是在于charEncrypt(int data)方法:
用其逆运算即可找出内置的!NGV%,$h1f4S3%2P(hkQ94==对应的软件内置base64解密,再根据映射关系找到正常的base64
strE  =    !NGV%,$h1f4S3%2P(hkQ94==
strD =     aMTEeIdmq4tHserKhmJyt==
strDD =  S2FuWHVlMjAxOWN0Zl9zdA==
2019-6-11 23:28
0
雪    币: 7833
活跃值: (1566)
能力值: ( LV12,RANK:256 )
在线值:
发帖
回帖
粉丝
3
其实用python的string,base64库几行代码就可以解了,没必要那么麻烦
2019-6-26 10:03
0
雪    币: 5568
活跃值: (3208)
能力值: ( LV12,RANK:407 )
在线值:
发帖
回帖
粉丝
4
fengvm 其实用python的string,base64库几行代码就可以解了,没必要那么麻烦
刚开始使用python。现在知道了。
2019-6-26 14:09
0
游客
登录 | 注册 方可回帖
返回
//