攻防世界逆向高手题之elrond32

99 篇文章 33 订阅

攻防世界逆向高手题之elrond32

继续开启全栈梦想之逆向之旅~
这题是攻防世界逆向高手题的elrond32
在这里插入图片描述

下载附件,照例扔入exeinfope中查看信息:
在这里插入图片描述

32位ELF文件,无壳,扔入32位IDA中查看伪代码信息,有Main函数看main函数:
在这里插入图片描述
.
.
额,看上去好像比较简单,int __cdecl main(int a1, char **a2)中a1是命令行传入参数的个数,起始值为1,a2是命令行传入参数的数组,a2[0]存的是程序名称,所以才有a1的起始1。我们传入的参数从a2[1]开始。
.
.
分析代码:

int __cdecl main(int a1, char **a2)
{
  if ( a1 > 1 && sub_8048414(a2[1], 0) )		//这里标识传入一个参数
  {
    puts("Access granted");
    sub_8048538((int)a2[1]);
  }
  else
  {
    puts("Access denied");
  }
  return 0;
}

.
.
跟踪sub_8048414函数:

int __cdecl sub_8048414(_BYTE *input_flag, int a2)
{
  int result; // eax

  switch ( a2 )                                 // a2=0
  {
    case 0:
      if ( *input_flag == 'i' )
        goto LABEL_19;
      result = 0;
      break;
    case 1:
      if ( *input_flag == 'e' )
        goto LABEL_19;
      result = 0;
      break;
    case 3:
      if ( *input_flag == 'n' )
        goto LABEL_19;
      result = 0;
      break;
    case 4:
      if ( *input_flag == 'd' )
        goto LABEL_19;
      result = 0;
      break;
    case 5:
      if ( *input_flag == 'a' )
        goto LABEL_19;
      result = 0;
      break;
    case 6:
      if ( *input_flag == 'g' )
        goto LABEL_19;
      result = 0;
      break;
    case 7:
      if ( *input_flag == 's' )
        goto LABEL_19;
      result = 0;
      break;
    case 9:
      if ( *input_flag == 'r' )
LABEL_19:
        result = sub_8048414(input_flag + 1, 7 * (a2 + 1) % 11);// 修改input_flag的地址,a2重新赋值,递归调用。
      else
        result = 0;
      break;
    default:
      result = 1;
      break;
  }
  return result;
}

这里我们先写脚本逆向这个逻辑先,只要保证每个返回的都是1即可:

a2=0
flag=""
for i in range(32):
	a=a2
	if a==0:
		flag+='i'
	elif a==1:
		flag+='e'
	elif a==3:
		flag+='n'
	elif a==4:
		flag+='d'
	elif a==5:
		flag+='a'
	elif a==6:
		flag+='g'
	elif a==7:
		flag+='s'
	elif a==9:				#python写c语言的
		flag+='r'
	else:
		break
	a2=7 * (a2 + 1) % 11
print(flag)
print(len(flag))

.
.
结果,一个8位的字符串:
在这里插入图片描述
.
.
跟踪下一个 sub_8048538((int)a2[1])函数:

int __cdecl sub_8048538(int input_flag)
{
  int v2[33]; // [esp+18h] [ebp-A0h] BYREF
  int i; // [esp+9Ch] [ebp-1Ch]

  qmemcpy(v2, &dword_8048760, sizeof(v2));
  for ( i = 0; i <= 32; ++i )
    putchar(v2[i] ^ *(char *)(input_flag + i % 8));	//一个简单的异或操作然后输出,%8对得上前面输出的8位字符串
  return putchar(10);
}

.
.
写IDA脚本打印dword_8048760数组内容:

addr=0x8048760
list=[]
for i in range(33):
    list.append(Dword(addr+4*i))
print(list)

.
.
在这里插入图片描述
.
.
复制粘贴数组,重新修改脚本内容:

a2=0
flag=""
v2=[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]
flag2=""
for i in range(32):
	a=a2
	if a==0:
		flag+='i'
	elif a==1:
		flag+='e'
	elif a==3:
		flag+='n'
	elif a==4:
		flag+='d'
	elif a==5:
		flag+='a'
	elif a==6:
		flag+='g'
	elif a==7:
		flag+='s'
	elif a==9:				#python写c语言的
		flag+='r'
	else:
		break
	a2=7 * (a2 + 1) % 11
print(flag)
print(len(flag))
for i in range(33):
	flag2+=chr(v2[i]^ord(flag[i%8]))
print(flag2)

.
.
结果:
在这里插入图片描述
.
.
总结:

唯一要注意的地方就是C语言的switch转python逻辑要用
if
elif
else 才行。
if
if
if
else这样是不行的,因为第一个if不对就会立刻跳到else去,而elif可以解决这个问题

解毕!敬礼!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐一 · 林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值