BUUCTF [GKCTF 2021]QQQQT(QT程序解包)

先看到题目给出的提示

去查找了一下关于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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值