[BJDCTF2020]JustRE

发布时间 2023-04-13 00:28:31作者: Tree_24

法一

先运行程序看看,只有getflag能点
img
这个猜测CE应该能破
查壳32位无壳,IDA查看
main()函数没什么有价值信息
查找字符串看看
img
BJD{%d%d2069a45792d233ac}长得就很像flag跟进

INT_PTR __stdcall DialogFunc(HWND hWnd, UINT a2, WPARAM a3, LPARAM a4)
{
  CHAR String[100]; // [esp+0h] [ebp-64h] BYREF

  if ( a2 != 272 )
  {
    if ( a2 != 273 )
      return 0;
    if ( (_WORD)a3 != 1 && (_WORD)a3 != 2 )
    {
      sprintf(String, Format, ++dword_4099F0);
      if ( dword_4099F0 == 19999 )
      {
        sprintf(String, " BJD{%d%d2069a45792d233ac}", 19999, 0);
        SetWindowTextA(hWnd, String);
        return 0;
      }
      SetWindowTextA(hWnd, String);
      return 0;
    }
    EndDialog(hWnd, (unsigned __int16)a3);
  }
  return 1;
}

Format 点进去是‘您已经点了 %d 次’
说明dword_4099F0存的是点击次数
然后判断是否点击19999次,输出BJD{1999902069a45792d233ac}
说明flag是BJD{1999902069a45792d233ac}
CE验证也是对的
img

法二

这题还可以用动态调试解决
X32dbg 打开
先搜索一下字符串
img
跳转到40704c
img
简单阅读一下汇编语句
先将寄存器eax压入栈中
调用函数401410
将寄存器eax中的值赋值给4099F0地址结合之前静态分析可知4099F0就是点击次数
然后移动指针
寄存器eax中的值与0x4ELF比较0x4ELF即为19999
Jne就是若不相等就跳转到4013D0
而中间的内容大概看一下就是输出flag的
所以jne这条语句就是关键的判断,我们将他nop掉
img
F9运行,随便点一下就出现flag了
img