IDA 分析
发现没有关键函数
在程序的 ida 代码中我们 发现 有个函数 是没有被调用过的 ques 函数。
int ques()
{
int v0; // edx
int result; // eax
int v2[50]; // [esp+20h] [ebp-128h]
int v3; // [esp+E8h] [ebp-60h]
int v4; // [esp+ECh] [ebp-5Ch]
int v5; // [esp+F0h] [ebp-58h]
int v6; // [esp+F4h] [ebp-54h]
int v7; // [esp+F8h] [ebp-50h]
int v8; // [esp+FCh] [ebp-4Ch]
int v9; // [esp+100h] [ebp-48h]
int v10; // [esp+104h] [ebp-44h]
int v11; // [esp+108h] [ebp-40h]
int v12; // [esp+10Ch] [ebp-3Ch]
int j; // [esp+114h] [ebp-34h]
__int64 v14; // [esp+118h] [ebp-30h]
int v15; // [esp+124h] [ebp-24h]
int v16; // [esp+128h] [ebp-20h]
int i; // [esp+12Ch] [ebp-1Ch]
v3 = 0x7FFA7E31;
v4 = 0x224FC;
v5 = 0x884A4239;
v6 = 0x22A84;
v7 = 0x84FF235;
v8 = 0x3FF87;
v9 = 0x88424233;
v10 = 0x23185;
v11 = 0x7E4243F1;
v12 = 0x231FC;
for ( i = 0; i <= 4; ++i )
{
memset(v2, 0, sizeof(v2));
v16 = 0;
v15 = 0;
v0 = *(&v4 + 2 * i);
LODWORD(v14) = *(&v3 + 2 * i);
HIDWORD(v14) = v0;
while ( SHIDWORD(v14) > 0 || v14 >= 0 && (_DWORD)v14 )
{
v2[v16++] = ((SHIDWORD(v14) >> 31) ^ (((unsigned __int8)(SHIDWORD(v14) >> 31) ^ (unsigned __int8)v14)
- (unsigned __int8)(SHIDWORD(v14) >> 31)) & 1)
- (SHIDWORD(v14) >> 31);
v14 /= 2LL;
}
for ( j = 50; j >= 0; --j )
{
if ( v2[j] )
{
if ( v2[j] == 1 )
{
putchar(42);
++v15;
}
}
else
{
putchar(32);
++v15;
}
if ( !(v15 % 5) )
putchar(32);
}
result = putchar(10);
}
return result;
}
函数里面 又 putchar 函数 可能会打印什么东西 ,我们可以直接 od 动态调试 修改一个 call 指令 让他能跳转执行 这个函数。
然后 单步运行完。
得到 flag