• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
M1nercy
博客园    首页    新随笔    联系   管理    订阅  订阅
2021.03.26_Reverse_xCTF_elrond32_WriteUp

25号鸽了,今天补两题

第一题,elrond32。丢进exeinfope看了一下又是Ubuntu文件,1分题懒得开虚拟机,直接扔进IDA。

找到main函数,翻译成C。

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的返回结果为1,就可以输出flag。这题的主要内容在于求出a2的内容。

进入sub_8048414:

signed int __cdecl sub_8048414(_BYTE *a1, int a2)
{
  signed 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;
}

注意,此函数中的a2[1]变成了a1,a2初始值为0。防止混淆可以改一下变量名。

这段代码逻辑很简单,switch判断a2内容,然后判断a1指向的内容,若符合条件则递归进下一轮,直到a2的内容不在switch中,循环结束,返回值result变为default中的1。

所以a2的值必然是if语句中的数字,不然无法进入递归。

a2的可能值只有01345679这八个数字,递归中传递的方式为 (a2+1)%11 ,用python看一下能取到的数字和顺序

a2 = 0
for i in range(9):
    a2 = 7 * (a2+1) % 11
    print(a2)
7
1
3
6
5
9
4
2
10

2和10都不在可选数中,取前八位即可。按顺序取if中的值,即main中a2的内容。

进入输出flag的函数sub_8048538中。

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

  qmemcpy(v2, &unk_8048760, sizeof(v2));
  for ( i = 0; i <= 32; ++i )
    putchar(v2[i] ^ *(char *)(a1 + i % 8));
  return putchar(10);
}

百度一下memcpy函数的作用,是将unk_8048760这块地址中的内容复制到v2中,复制的大小为sizeof(v2)。

双击进入View-A界面,将地址中数组的内容抄下来,用万能的python把flag输出算法重新实现一遍输出即可

key = [105, 115, 101, 110, 103, 97, 114, 100]
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]
flag = ''
for i in range(33):
    flag += chr(v2[i] ^ key[(i % 8)])
print(flag)

flag{s0me7hing_S0me7hinG_t0lki3n}

posted on 2021-03-26 15:38  M1nercy  阅读(85)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3