运行得到Access deny
我第一次尝试是
修改判断条件,jz改为jnz,jle改为jg,
这个思路运行后,代码因为缺少一个输入,而导致程序运行错误,所以我们只能静态分析
我们想进入Access grant
有两个函数,我们一个一个看
这是第一个
int __cdecl sub_8048414(_BYTE *a1, int a2)
{
int result; // eax
switch ( a2 )
{
case 0:
if ( *a1 == 'i' )
goto LABEL_19;
result = 0;
break;
case 1:
if ( *a1 == 'e' )
goto LABEL_19;
result = 0;
break;
case 3:
if ( *a1 == 'n' )
goto LABEL_19;
result = 0;
break;
case 4:
if ( *a1 == 'd' )
goto LABEL_19;
result = 0;
break;
case 5:
if ( *a1 == 'a' )
goto LABEL_19;
result = 0;
break;
case 6:
if ( *a1 == 'g' )
goto LABEL_19;
result = 0;
break;
case 7:
if ( *a1 == 's' )
goto LABEL_19;
result = 0;
break;
case 9:
if ( *a1 == 'r' )
LABEL_19:
result = sub_8048414(a1 + 1, 7 * (a2 + 1) % 11);
else
result = 0;
break;
default:
result = 1;
break;
}
return result;
}
a2=0,a1=a2[1]
我们代入a2=0,运行函数里面的代码
因为函数没有case没有2和8
07136594
对应case里面的字符串
iendagsd
我们再看第二个函数
int __cdecl sub_8048538(int a1)
{
int v2[33]; // [esp+18h] [ebp-A0h] BYREF
int i; // [esp+9Ch] [ebp-1Ch]
qmemcpy(v2, &unk_8048760, sizeof(v2));
for ( i = 0; i <= 32; ++i )
putchar(v2[i] ^ *(char *)(a1 + i % 8));
return putchar(10);
}
v2的33个字符可以提取出来
有下面的python脚本代码
# import string
a=[15, 31, 4, 9, 28, 18, 66, 9, 12, 68, 13, 7, 9, 6, 45, 55, 89, 30, 0, 89, 15, 8, 28, 35, 54, 7, 85, 2, 12, 8, 65, 10, 20]
# T = 'iendagsr'
T = 'isengard'
for i in range(len(a)):
print(chr(a[i] ^ ord(T[i%len(T)])),end='')
得到flag{s0me7hing_S0me7hinG_t0lki3n}
我看官方WP,还可以
直接在文件后面输入