首页
论坛
课程
招聘
[原创]CTF2019Q2T1 破文
2019-6-12 14:45 798

[原创]CTF2019Q2T1 破文

2019-6-12 14:45
798
上IDA,定位到主函数:
int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // esi
  unsigned int v4; // kr00_4
  unsigned int v6; // ecx
  char szData[7]; // [esp+10h] [ebp-3Ch]
  CPPEH_RECORD ms_exc; // [esp+34h] [ebp-18h]

  v3 = 0;
  Printf((int)"请输入序列号:\n");
  sub_4013D0("%s", szData);
  v4 = strlen(szData);
  if ( v4 < 7
    && szData[5] == '3'
    && szData[4] == '5'
    && szData[3] == '3'
    && (unsigned __int8)szData[2] + (unsigned __int8)szData[1] + (unsigned __int8)szData[0] == 149 )
  {
    v6 = 0;
    if ( v4 )
    {
      do
        v3 = (unsigned __int8)szData[v6++] + 16 * v3 - '0';
      while ( v6 < v4 );
    }
    ms_exc.registration.TryLevel = 0;
    if ( v3 )
      JUMPOUT(*(_DWORD *)&byte_401353);
    Printf((int)"error!\n");
    while ( 1 )
      ;
  }
  Printf((int)"error\n");
  return 0;
}
很明显答案 ***353。 *的和未149. 那么理论值为 0 1 2 3 4 5 和为5。

.text:00401342 ;   __try { // __except at loc_401379
.text:00401342                 mov     [ebp+ms_exc.registration.TryLevel], 0
.text:00401349                 test    esi, esi
.text:0040134B                 jz      short loc_40135D
.text:0040134D                 push    eax
.text:0040134E                 call    loc_401354
.text:0040134E ; ---------------------------------------------------------------------------
.text:00401353 byte_401353     db 0EBh
.text:00401354 ; ---------------------------------------------------------------------------
.text:00401354
.text:00401354 loc_401354:                             ; DATA XREF: _main+EE↑o
.text:00401354                 pop     eax
.text:00401355                 sub     eax, 0
.text:00401358                 sub     esi, eax
.text:0040135A                 div     esi
.text:0040135C                 pop     eax
以上代码有点变异。 执行完成后直接跳转到错误输出处。在下边不远处为sucess值。
唯一可能在div 指令进入异常处理。那么eax = esi。eax = 401353。
所以答案 401353



第五届安全开发者峰会(SDC 2021)议题征集正式开启!

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回