攻防世界-reverse-高手进阶区-elrond32

题目描述

解题

附件下载下来是一个压缩包,解压后得到文件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博客

上一篇:Python高阶应用和常见错误总结


下一篇:JS反转字符串