攻防elrond

攻防elrond,第1张

攻防elrond 分析

拖入ida看main函数

int __cdecl main(int a1, char **a2)
{
  if ( a1 > 1 && sub_8048414(a2[1], 0) )
  {
    puts("Access granted");
    sub_8048538(a2[1]);
  }
  else
  {
    puts("Access denied");
  }
  return 0;
}

只要让**sub_8048414(a2[1], 0)**的返回值为1即可

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;
}

看到a1的值有9个(没有2),每个对应一个a2的值

只有当a1在这十个数的范围内,并且a2=2才会成功

这个函数的 作用就是每次对a2进行:7 * (a2 + 1) % 11 的 *** 作,得到的结果对应case中的a1的值

也就是判断按照a2的顺序进行的时候,a1的值是否对应正确,若正确则成功

所以先看看a2的顺序是什么

printf("%d\n",a2);
	for(i=1;i<9;i++)
	{
		a2 =  7 *(a2+1) % 11;
		printf("%d\n",a2);
	}

顺序是:071365942

解答方法一:解密脚本

对应的a1是:105,115,101,110,103,97,114,100

然后看输出函数:

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] ^ *(a1 + i % 8));
  return putchar(10);
}

按照输出函数写解密脚本:

#include 
int main()
{				
	char a1[8] = {105,115,101,110,103,97,114,100};
	char v2[33] = {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};

	int i;
	int a2=0;
	char flag[32] = {0};
	printf("%d\n",a2);
	for(i=1;i<9;i++)
	{
		a2 =  7 *(a2+1) % 11;
		printf("%d\n",a2);
	}
	
	for(i=0;i<=33;i++)
	{
		flag[i] = (v2[i] ^ a1[(i % 8)]);
		
	}
	for(i=0;i<33;i++)
	{
		printf("%c",flag[i]);
	}
	return 0;
}

运行得到flag

flag{s0me7hing_S0me7hinG_t0lki3n}

方法二:终端输入,运行输出

正确顺序的a1是:105,115,101,110,103,97,114,100

对应的字符是:isengard

所以拖入虚拟机中运行

发现不给我输入的机会

此时反应过来带参数的main函数知识:

int main(argc,argv[])
比如在命令行中输入:3 a b c,则argc = 3,argv[1] = a,argv[2] = b,argv[3] = c

所以在运行程序前就要输入参数

果然直接输出flag

自己还是太菜,这么简单的题都要看wp(5555555555)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/579155.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存