首先看一下是个exe文件,拉进EXEInfoPE看一下
是个32位exe文件无壳,打开看一下,果然是个恶趣味的出题人
怎么个恶趣味法,自己点点就知道,
大致猜测一波flag估计与这有关
然后拉近IDAx86看一下,看见winmain进去看一下伪代码,实在没有找到有用的线索
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
int result; // eax@1
HACCEL v5; // esi@2
struct tagMSG Msg; // [sp+8h] [bp-1Ch]@2
LoadStringA(hInstance, 0x67u, WindowName, 100);
LoadStringA(hInstance, 0x6Du, ClassName, 100);
sub_4010C0(hInstance);
result = sub_401150(hInstance, nShowCmd);
if ( result )
{
v5 = LoadAcceleratorsA(hInstance, (LPCSTR)0x6D);
while ( GetMessageA(&Msg, 0, 0, 0) )
{
if ( !TranslateAcceleratorA(Msg.hwnd, v5, &Msg) )
{
TranslateMessage(&Msg);
DispatchMessageA(&Msg);
}
}
result = Msg.wParam;
}
return result;
}
没有的话我们根据之前的打开的exe文件的窗口的线索,用快捷键shift+F12查看一下字符串
看到
.rdata:004064D4 0000000C C MessageBoxA
.rdata:004064E0 0000000B C user32.dll
.rdata:004067CC 0000000B C USER32.dll
.rdata:00406AC6 0000000D C KERNEL32.dll
.data:00407030 0000001B C BJD{%d%d2069a45792d233ac}
.data:0040704C 00000023 C 您已经点了 %d 次,加油不要停下来!
.data:00407108 00000005 C
这就不就是flag了嘛,赶紧点进去看一下伪代码
BOOL __stdcall DialogFunc(HWND hWnd, UINT a2, WPARAM a3, LPARAM a4)
{
CHAR String; // [sp+0h] [bp-64h]@5
if ( a2 != 272 )
{
if ( a2 != 273 )
return 0;
if ( (_WORD)a3 != 1 && (_WORD)a3 != 2 )
{
sprintf(&String, aNUDGmKGGb, ++dword_4099F0);
if ( dword_4099F0 == 19999 )
{
sprintf(&String, aBjdDD2069a4579, 19999, 0);
SetWindowTextA(hWnd, &String);
return 0;
}
SetWindowTextA(hWnd, &String);
return 0;
}
EndDialog(hWnd, (unsigned __int16)a3);
}
return 1;
}
穿插一下哈,不知道是不是我的原因,点进去不能F5直接查看伪代码,所以我稍微取巧一下了,看到它在sprintf()函数上面,我就点开它上面的函数,果然是,也能打开,交叉查看我的还是不能看伪代码,顺便提一下CTRL+X是查看交叉
有两个占位符 要填两个字符进去
aBjdDD2069a4579的值就是:BJD{%d%d2069a45792d233ac}
第一个%d应该是19999,第二个是0
‘
flag也就是{1999902069a45792d233ac}
这道题明显比前面的简单,一起变强!!
加油哦!!!!