特殊的 BASE64 1
这个一看题目就是base64编码表被改了.
知识点:
Base64编码使用一个包含64个字符的字符集,这些字符分别是:
- 大写字母A-Z
- 小写字母a-z
- 数字0-9
- 特殊字符+和/
这些字符分别对应64个不同的6位二进制数。在补零后形成的8位字节中,实际使用的只有低6位。
内容为:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
例行检查,载入PE
无壳,64bit
载入IDA(64bit)
寻找main函数.
int __fastcall main(int argc, const char **argv, const char **envp)
{std::ostream *v3; // raxstd::ostream *v4; // raxstd::string result; // [rsp+20h] [rbp-60h] BYREFstd::string rightFlag; // [rsp+30h] [rbp-50h] BYREFstd::string str; // [rsp+40h] [rbp-40h] BYREFchar v9; // [rsp+4Fh] [rbp-31h] BYREFstd::string v10; // [rsp+50h] [rbp-30h] BYREF_main();std::string::string(&str);std::allocator<char>::allocator(&v9);std::string::string(&rightFlag, "mTyqm7wjODkrNLcWl0eqO8K8gc1BPk1GNLgUpI==", &v9);std::allocator<char>::~allocator(&v9);v3 = (std::ostream *)std::operator<<<std::char_traits<char>>(refptr__ZSt4cout, "Please input your flag!!!!");refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(v3);std::operator>><char>(refptr__ZSt3cin, &str);std::string::string(&v10, &str);base64Encode(&result);std::string::~string(&v10);if ( std::operator==<char>(&result, &rightFlag) )v4 = (std::ostream *)std::operator<<<std::char_traits<char>>(refptr__ZSt4cout, "The flag is right!!!!!!!!!");elsev4 = (std::ostream *)std::operator<<<std::char_traits<char>>(refptr__ZSt4cout, "This is a wrong flag!!!!!!!!");refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(v4);std::string::~string(&result);std::string::~string(&rightFlag);std::string::~string(&str);return 0;
}
我们这里可以发现有一个rightflag:mTyqm7wjODkrNLcWl0eqO8K8gc1BPk1GNLgUpI==
还有一个base64Encode(&result);,用来进行base64编码,base64编码表估计就在里面呢.
点进去看看.
找到了,开始构造exp
import base64
str1 = "mTyqm7wjODkrNLcWl0eqO8K8gc1BPk1GNLgUpI=="
string1 = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0987654321/+"
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
print(base64.b64decode(str1.translate(str.maketrans(string1, string2))))
得到flag,游戏结束~