附件下载下来是一个压缩包,解压后得到文件rev300
exeinfope查看信息得知是32位的ELF可执行文件
使用ida打开该文件,在main函数中F5反汇编出源码
“Access granted”表明其下的函数sub_8048538与flag密切相关,进入此函数
代码分析:
v2数组有33个元素,内容在内存别名为byte_8048760的地方,后面会用到
我们还需要知道a1数组的内容,而且根据代码我们知道a1数组有8个元素
返回主函数,sub_8048538传参为a2[1],可以看到a2[1]在函数sub_8048414的参数中有出现
想让主函数输出Access granted,sub_8048414需要返回非1
进入sub_8048414
int __cdecl sub_8048414(_BYTE *a1, int a2) { int result; // eax switch ( a2 ) { case 0: if ( *a1 == 105 ) goto LABEL_19; result = 0; break; case 1: if ( *a1 == 101 ) goto LABEL_19; result = 0; break; case 3: if ( *a1 == 110 ) goto LABEL_19; result = 0; break; case 4: if ( *a1 == 100 ) goto LABEL_19; result = 0; break; case 5: if ( *a1 == 97 ) goto LABEL_19; result = 0; break; case 6: if ( *a1 == 103 ) goto LABEL_19; result = 0; break; case 7: if ( *a1 == 115 ) goto LABEL_19; result = 0; break; case 9: if ( *a1 == 114 ) LABEL_19: result = sub_8048414(a1 + 1, 7 * (a2 + 1) % 11); else result = 0; break; default: result = 1; break; } return result; }
我们需要使该函数输出非1,根据代码可知只有在LABEL_19和default处才能输出非1
根据主函数可知a2初始值为0,case==0,需要使a1[0]=105才能跳转到LABEL_19,防止函数返回0,跳转后,函数递归,据此逻辑,可以算出每次递归时传入的参数:
a2:0,7,1,3,6,5,9,4,2
a1:[105,115,101,110,103,97,114,100]
当a2=4时,得到a1[7]=100,接着进入递归,算出a2=7*(4+1)%11=2,因此函数进入default,返回1,这样我们便得到了能使主函数进入Access granted的数组值
也可以写代码算出a1数组中的各元素值,参考大佬代码如下:
int a1[20]={105,101,0,110,100,97,103,115,0,114,0,0}; for(int i=0;;i=7*(i+1)%11,k++) { a2[k]=a1[i]; printf("*%d\n",i); if(i==2||i==8||i>9)break; } //a2={105,115,101,110,103,97,114,100,0}
回到sub_8048538函数,现在我们有了a1数组值,还需去内存找到v2数组的值
v2数组元素为int类型(4字节),易知v2数组为[0x0f,0x1f,0x04,0x09,0x1c,0x12,0x42,0x09,0x0c,0x44,0x0d,0x07,0x09,0x06,0x2d,0x37,0x59,0x1e,0x00,0x59,0x0f,0x08,0x1c,0x23,0x36,0x07,0x55,0x02,0x0c,0x08,0x41,0x0a,0x14,0x00]
再根据sub_8048538函数逻辑写出代码,就能得到flag啦
v2 = [0x0f, 0x1f, 0x04, 0x09, 0x1c, 0x12, 0x42, 0x09, 0x0c, 0x44, 0x0d, 0x07, 0x09, 0x06, 0x2d, 0x37, 0x59, 0x1e, 0x00, 0x59, 0x0f, 0x08, 0x1c, 0x23, 0x36, 0x07, 0x55, 0x02, 0x0c, 0x08, 0x41, 0x0a, 0x14, 0x00] a1 = [105, 115, 101, 110, 103, 97, 114, 100] for i in range(33): print(chr(v2[i] ^ a1[i % 8]), end="")
flag为flag{s0me7hing_S0me7hinG_t0lki3n}
参考链接:
【攻防世界】逆向-elrond32 - 寒江寻影 - 博客园
攻防世界elrond32题解_SNiFe的博客-CSDN博客