下载,查看:
ida打开,f5,一堆函数:
int __cdecl main(int argc, const char **argv, const char **envp)
{
setlocale(6, &locale);
banner();
prompt_authentication();
authenticate();
return 0;
}
一一进行函数分析:
banner就是输出两个字符串,感觉像欢迎信息或者说明吧:
int banner()
{
unsigned int v0; // eax
v0 = time(0);
srand(v0);
wprintf(&unk_80488B0);
rand();
return wprintf(&unk_8048960);
}
prompt_authentication类似:
int prompt_authentication()
{
return wprintf(&unk_80489F8);
}
最后剩下authenticate:
void authenticate()
{
wchar_t ws[8192]; // [esp+1Ch] [ebp-800Ch]
wchar_t *s2; // [esp+801Ch] [ebp-Ch]
s2 = (wchar_t *)decrypt(&s, &dword_8048A90); #这行关键
if ( fgetws(ws, 0x2000, stdin) )
{
ws[wcslen(ws) - 1] = 0;
if ( !wcscmp(ws, s2) )
wprintf(&unk_8048B44);
else
wprintf(&unk_8048BA4);
}
free(s2);
}
代码中的s是全局变量,然后经过decrypt函数处理,赋值给s2,我们的输入赋值给ws,然后就是比较ws与s2,意思是程序已经知道正确答案了,这就好办了。
动态运行,在s2赋值处下断点:
执行到728完成decrypt函数对s2赋值就可以:
注意这里是地址赋值,双击是s2只能看到地址9074010:
在linux下,用gdb也是一样,命令如下:
gdb no-string-attached
b *0x08048725 #下断点
r #运行
x/6sw $eax #查看eax的值