运行调试和结果
就一个简单框题, 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))