首页
社区
课程
招聘
[原创]【2019看雪CTF】Q1赛季 第五题 青梅竹马 WP
发表于: 2019-3-23 20:55 3228

[原创]【2019看雪CTF】Q1赛季 第五题 青梅竹马 WP

2019-3-23 20:55
3228

这是一个窗体程序,程序流程比较简洁,直接在WinMain中通过DialogBoxParamA设置对话框的事件处理函数DialogFunc

函数DialogFunc伪代码如下:

按钮响应函数mainroutine_402652主要流程如下:

程序中的信息解码及输入编解码校验用的是改了表的base64。所用表如下:

输入格式检查规则如下:

以下是输入的编解码及最终校验的调用代码:

输入先base64解码再编码后与原始输入比较,如正确则进入最终校验。最终校验返回2,则解码成功提示信息,最后弹窗显示。因为解码信息的函数第一个参数是解码字串的index,这些字串后解码后是这样的:

最终校验代码如下:

大致流程是:生成100以内的素数数组,输入debase后值转成大数记为m,0x4f(隐藏文本框中的值)以内的素数相乘记为大数n,然后求pow(m,0x53,n) == 2
明显的RSA,只不过n不是两个素数相乘,而是多素数相乘。求解是差不多的,(p-1)*(q-1)换成各素乘数减1相乘即可。其它都是一样的。

再用上面的base64表做下base64编码,加上分隔符'V'就是答案了:PEDIyV9102dVreadyu

int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
  int v4; // eax

  v4 = GetTickCount();
  sub_403371(v4);
  ::hInstance = hInstance;
  DialogBoxParamA(hInstance, (LPCSTR)0x65, 0, DialogFunc, 0);
  return 0;
}
BOOL __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4)
{
  switch ( a2 )
  {
    case WM_CLOSE:
      goto LABEL_14;
    case WM_INITDIALOG:
      sub_402B3A(hDlg);
      return 0;
    case WM_COMMAND:
      switch ( (unsigned __int16)a3 )
      {
        case 2u:
          goto LABEL_14;
        case 0x3EAu:
          mainroutine_402652(hDlg);
          return 0;
        case 0x3ECu:
LABEL_14:
          EndDialog(hDlg, 0);
          break;
      }
      break;
  }
  return 0;
}
ABCyVPGHTJKLMNOFQRSIUEWDYZgbc8sfah1jklmnopqret5v0xX9wi234u67dz+/
    gen_402889(80, v10, 0x40u);
    gen_base_re_table_402270(v10);
    v6 = debase_402297((unsigned __int8 *)v11, v13);
    enbase_40231E((unsigned __int8 *)v13, v9, v6);
    if ( v13[0] )
    {
      if ( !memcmp(v9, v11, v17) )
      {
        v7 = check_4024E1(100, v5, v13, v6);
        decode_info_402A90((int)v7, Text);
      }
    }

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

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//