elf文件,打开提示需要输入正确password
IDA查看字符串
查看Correct
附近的反汇编代码
将输入字符串的地址和0x0作为sub_8048580
的两个参数,调用sub_8048580
后返回值为1则跳转到Correct
处
查看sub_8048580
反编译代码
_BOOL4 __cdecl sub_8048580(int a1, int a2)
{
char v3; // al
_BOOL4 result; // eax
char v5[128]; // [esp+Ch] [ebp-A0h] BYREF
unsigned int v6; // [esp+8Ch] [ebp-20h]
v6 = __readgsdword(0x14u);
while ( 1 )
{
memset(v5, 0, sizeof(v5));
v3 = *(_BYTE *)(a1 + a2); // v3随a2改变
v5[(v3 + 64) % 128] = 1;
switch ( v3 )
{
case '\n':
return a2 == 13 && v5[74] != 0;
case '0':
if ( a2 || !v5[112] )
return 0;
a2 = 1;
continue;
case '1':
if ( a2 == 14 && v5[113] )
goto LABEL_12;
return 0;
case '2':
if ( a2 == 20 && v5[114] )
goto LABEL_15;
return 0;
case '3':
if ( a2 != 89 || !v5[115] )
return 0;
a2 = 90;
continue;
case '4':
if ( a2 != 15 || !v5[116] )
return 0;
a2 = 16;
continue;
case '5':
if ( a2 != 14 || !v5[117] )
return 0;
LABEL_12:
a2 = 15;
continue;
case '6':
if ( a2 != 12 || !v5[118] )
return 0;
a2 = 13;
continue;
case '7':
if ( a2 != 5 || !v5[119] )
return 0;
a2 = 6;
continue;
case '8':
result = 0;
if ( v5[121] )
result = a2 == 33 || a2 == 2;
return result;
case '9':
if ( a2 != 1 || !v5[121] )
return 0;
a2 = 2;
continue;
case 'a':
if ( a2 != 35 || !v5[33] )
return 0;
a2 = 36;
continue;
case 'b':
if ( a2 != 11 || !v5[34] )
return 0;
a2 = 12;
continue;
case 'c':
if ( a2 != 32 || !v5[33] )
return 0;
a2 = 33;
continue;
case 'd':
if ( a2 != 3 || !v5[36] )
return 0;
a2 = 4;
continue;
case 'e':
if ( a2 != 7 || !v5[37] )
return 0;
a2 = 8;
continue;
case 'f':
if ( !v5[38] || a2 != 8 && a2 != 4 )
return 0;
goto LABEL_53;
case 'g':
return a2 == 12 && v5[52] != 0;
case 'h':
if ( a2 != 13 || !v5[39] )
return 0;
a2 = 14;
continue;
case 'i':
if ( a2 != 9 || !v5[41] )
return 0;
a2 = 10;
continue;
case 'j':
if ( a2 != 10 || !v5[42] )
return 0;
a2 = 11;
continue;
case 'k':
return a2 == 12 && v5[43] != 0;
case 'l':
if ( a2 != 19 || !v5[44] )
return 0;
a2 = 20;
continue;
case 'm':
if ( a2 != 17 || !v5[45] )
return 0;
a2 = 18;
continue;
case 'n':
return a2 == 18 && v5[45] != 0;
case 'o':
if ( !v5[46] || a2 != 6 && a2 != 28 )
return 0;
LABEL_53:
++a2;
continue;
case 'p':
if ( a2 != 30 || !v5[48] )
return 0;
a2 = 31;
break;
case 'q':
if ( a2 != 29 || !v5[49] )
return 0;
a2 = 30;
break;
case 'r':
if ( a2 != 20 || !v5[50] )
return 0;
LABEL_15:
a2 = 21;
break;
case 's':
if ( a2 != 25 || !v5[51] )
return 0;
a2 = 26;
break;
case 't':
return a2 == 24 && v5[50] != 0;
case 'u':
if ( a2 != 26 || !v5[53] )
return 0;
a2 = 27;
break;
case 'v':
if ( a2 != 2 || !v5[54] )
return 0;
a2 = 3;
break;
case 'w':
if ( a2 != 6 || !v5[55] )
return 0;
a2 = 7;
break;
case 'x':
if ( a2 != 22 || !v5[56] )
return 0;
a2 = 23;
break;
case 'y':
if ( a2 != 23 || !v5[57] )
return 0;
a2 = 24;
break;
case 'z':
return a2 == 21 && v5[33] != 0;
default:
return 0;
}
}
}
输入的第一个字符为不0
时,返回值为0
接着推下去可以得出正确的password为09vdf7wefijbk
flag{09vdf7wefijbk}