题目链接和write up

运行调试和结果

就一个简单框题, vc6写的,而且作者也说没什么防护
我的结果是 1555

反编译

F12 搜索字符串,确实有成功提示,跳转到引用出,但发现相应函数不能F5大法,说不在函数体内,其实是因为IDA没有把这段代码认识是代码OTZ,姑且这样认为吧,我们可以手动点击函数体名,右击选择Creat function 就可以反编译了

反编译位置

之前函数设定有点问题 ,我是在.text:004011F4 .text:004012AA两个位置创建了函数,反编译出来很简单了

int sub_4011F4()
{
  int v0; // ecx
  double v1; // st7
  double v2; // st6
  double v3; // st6
  CHAR num1; // [esp+0h] [ebp-1Ch]
  char num2; // [esp+1h] [ebp-1Bh]
  char num3; // [esp+2h] [ebp-1Ah]
  char num4; // [esp+3h] [ebp-19h]
  int v9; // [esp+18h] [ebp-4h]
  int savedregs; // [esp+1Ch] [ebp+0h]

  GetDlgItemTextA(hDlg, 1001, &num1, 21);
  Sleep(0x1F4u);
  JUMPOUT(strlen(&num1), 4, &loc_4012CF);
  JUMPOUT(num1, 48, &loc_4012CF);
  JUMPOUT(num2, 48, &loc_4012CF);
  JUMPOUT(num3, 48, &loc_4012CF);
  JUMPOUT(num4, 48, &loc_4012CF);
  JUMPOUT(num1, 49, &loc_4012CF);
  JUMPOUT(num2, 53, &loc_4012CF);
  JUMPOUT(num2 == 53, (char *)&loc_401262 + 1);
  JUMPOUT(num2 != 53, (char *)&loc_401262 + 1);
  MEMORY[0x48CACD]();
  v9 = num3 - v0;                               // v0 = 0
  v1 = (double)v9;
  v9 = num1 - v0;
  v2 = (double)v9;
  v9 = num2 - v0;
  v3 = v2 / (double)v9;
  v9 = num4 - v0;
  *(float *)&v9 = (v1 - v3) * (double)v9 * 16.0;
  JUMPOUT(num4, v0, (char *)sub_4012AA + 1);
  JUMPOUT(num4 != v0, (char *)sub_4012AA + 1);
  return sub_4012AA((int)&savedregs);
}

JUMPOUT就是一个判断并且。1,2 ,参数是判断条件,第三个参数是跳转地址
sub_4012AA地址反编译如下

int __usercall sub_4012AA@<eax>(int a1@<ebp>)
{
  int result; // eax

  MEMORY[0x48CB15]();
  if ( *(float *)(a1 - 4) == 384.0 ) #a1-4就是上面的v9
    result = MessageBoxA(hWnd, aRegistrationSu, aCrackme2017Ctf, 0);
  else
    result = MessageBoxA(hWnd, Text, aCrackme2017Ctf, 0);
  return result;
}

很简单的运算:
已经知道flag为4位数,第一位是1,第二位是5,并且3·4·位不能是0,这里假设第三位为x,第四位位y,最后满足:(x-0.2)*y*16 = 384 就好了

Solver

for x in range(1,10):
    for y in range(1,10):
        if ((x-0.2)*y*16 == 384 ):
            print('x:{} y:{}'.format(x,y))


CTF  

逆向

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!