先看到题目给出的提示
去查找了一下关于QT的知识
Qt是一个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。
在Linux系统中,软件包管理是一个重要的概念。通过打包Qt程序,可以将程序及其依赖项打包到一个文件中,方便在其他Linux系统上部署和运行。这样可以避免用户在安装程序时遇到缺少依赖项的问题,简化了部署流程。
打包Qt程序使其成为一个独立的可执行文件,方便发布和分发。用户可以通过简单地执行该文件来运行程序,而无需进行额外的设置或配置。
而Qt程序解包就需要Enigma Virtual Box解包器
Enigma Virtual Box 是一款用于Windows平台上的软件虚拟化工具,主要用于将应用程序及其所有相关文件(如动态链接库DLL、资源文件、配置文件等)封装到单一可执行文件中,这样无需实际安装或解压,用户可以直接运行这个单个EXE文件来启动应用程序。通过这种方式,可以极大地简化分发和部署流程,同时也方便用户携带和使用。
下载地址
Software Protection, Software Licensing, Software Virtualization
把文件拖入解包器 解包成功
解包后得到两个文件
而%DEFAULT FOLDER%里面的untitled2.exe为解码后的文件
将untitled2.exe文件拖入ida
shift+F12查找字符串 发现可疑字符串
双击进去 F5查看源代码
void __thiscall sub_4012F0(_DWORD *this)
{
int v1; // edi
_BYTE *v2; // esi
const char *v3; // edx
_BYTE *v4; // esi
int v5; // ecx
int v6; // eax
int v7; // ecx
int v8; // edx
int v9; // edi
int v10; // esi
_BYTE *v11; // ecx
unsigned int v12; // ecx
size_t v13; // [esp-8h] [ebp-A8h]
char v15[4]; // [esp+10h] [ebp-90h] BYREF
char v16[4]; // [esp+14h] [ebp-8Ch] BYREF
_BYTE *v17; // [esp+18h] [ebp-88h]
const char *v18; // [esp+1Ch] [ebp-84h]
int v19; // [esp+20h] [ebp-80h]
int v20; // [esp+24h] [ebp-7Ch] BYREF
_BYTE *v21; // [esp+28h] [ebp-78h] BYREF
char v22[60]; // [esp+2Ch] [ebp-74h] BYREF
__int128 v23[2]; // [esp+68h] [ebp-38h] BYREF
__int64 v24; // [esp+88h] [ebp-18h]
int v25; // [esp+9Ch] [ebp-4h]
QLineEdit::text(*(_DWORD *)(this[6] + 4), v15);
v25 = 0;
QString::toLatin1(v15, v16);
LOBYTE(v25) = 1;
v18 = QByteArray::data((QByteArray *)v16);
memset(v23, 0, sizeof(v23));
v24 = 0i64;
strcpy(v22, "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");
v20 = 138 * strlen(v18) / 0x64;
v13 = v20 + 1;
v1 = 0;
v21 = malloc(v20 + 1);
v2 = v21;
memset(v21, 0, v13);
v3 = v18;
v19 = (int)(v18 + 1);
if ( strlen(v18) )
{
v4 = &v2[v20];
v17 = v4;
while ( 1 )
{
v19 = ((char)*v4 << 8) + v3[v1];
v5 = v19 / 58;
*v4 = v19 % 58;
if ( v5 )
{
do
{
v6 = (char)*--v4;
v7 = (v6 << 8) + v5;
v19 = v7 / 58;
*v4 = v7 % 58;
v5 = v19;
}
while ( v19 );
v4 = v17;
}
if ( ++v1 >= strlen(v18) )
break;
v3 = v18;
}
v2 = v21;
}
v8 = 0;
if ( !*v2 )
{
do
++v8;
while ( !v2[v8] );
}
v9 = v20;
if ( v8 <= v20 )
{
v10 = v2 - (_BYTE *)v23;
do
{
v11 = (char *)v23 + v8++;
*v11 = v22[(char)v11[v10]];
}
while ( v8 <= v9 );
}
if ( !qstrcmp((const char *)v23, "56fkoP8KhwCf3v7CEz") )
{
if ( v18 )
v12 = strlen(v18);
else
v12 = -1;
v21 = (_BYTE *)QString::fromAscii_helper(v18, v12);
LOBYTE(v25) = 2;
v20 = QString::fromAscii_helper("flag", 4);
LOBYTE(v25) = 3;
QMessageBox::warning(this, &v20, &v21, 1024, 0);
QString::~QString((QString *)&v20);
QString::~QString((QString *)&v21);
}
QByteArray::~QByteArray((QByteArray *)v16);
QString::~QString((QString *)v15);
}
看到这个编码表123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz就知道是Base58了
也不用写啥反脚本了 直接把密文进行Base58解密
flag为flag{12t4tww3r5e77}