-
-
[原创]第六题:消失的岛屿
-
发表于:
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期)