【攻防世界】Reverse——secret-galaxy-300 writeup

由main函数查看相关代码,但是代码中并没有直接的关于flag的信息:

复制代码
int __cdecl main(int argc, const char **argv, const char **envp)
{
  __main();
  fill_starbase(&starbase);
  print_starbase((int)&starbase);
  return 0;
}
void __cdecl fill_starbase(int a1)
{
  int i; // [esp+8h] [ebp-10h]
  int v2; // [esp+Ch] [ebp-Ch]

  v2 = 0;
  for ( i = 0; i <= 4; ++i )
  {
    *(_DWORD *)(a1 + 24 * i) = galaxy_name[i];
    *(_DWORD *)(24 * i + a1 + 4) = rand();
    *(_DWORD *)(24 * i + a1 + 8) = 0;
    *(_DWORD *)(24 * i + a1 + 12) = 0;
    *(_DWORD *)(24 * i + a1 + 16) = 24 * (i + 1) + a1;
    *(_DWORD *)(a1 + 24 * i + 20) = v2;
    v2 = 24 * i + a1;
  }
}
int __cdecl print_starbase(int a1)
{
  int result; // eax
  const char *v2; // edx
  int i; // [esp+1Ch] [ebp-Ch]

  puts("--------------GALAXY DATABASE-------------");
  printf("%10s | %s | %s\n", "Galaxy name", "Existence of life", "Distance from Earth");
  result = puts("-------------------------------------------");
  for ( i = 0; i <= 4; ++i )
  {
    if ( *(_DWORD *)(24 * i + a1 + 8) == 1 )
      v2 = "INHABITED";
    else
      v2 = "IS NOT INHABITED";
    result = printf("%11s | %17s | %d\n", *(const char **)(24 * i + a1), v2, *(_DWORD *)(24 * i + a1 + 4));
  }
  return result;
}

注意到print_starbase只是打印了5个galaxy,但galaxy_name有6个元素:

c通过交叉引用,找到了下面的代码:

cpp 复制代码
int __libc_csu_gala()
{
  int result; // eax

  sc[0] = off_409014;
  sc[3] = &byte_40DAC0;
  sc[1] = 31337;
  sc[2] = 1;
  byte_40DAC0 = off_409004[0][8];
  byte_40DAC1 = off_409010[0][7];
  byte_40DAC2 = off_409008[0][4];
  byte_40DAC3 = off_409004[0][6];
  byte_40DAC4 = off_409004[0][1];
  byte_40DAC5 = off_409008[0][2];
  byte_40DAC6 = 95;
  byte_40DAC7 = off_409004[0][8];
  byte_40DAC8 = off_409004[0][3];
  byte_40DAC9 = off_40900C[0][5];
  byte_40DACA = 95;
  byte_40DACB = off_409004[0][8];
  byte_40DACC = off_409004[0][3];
  byte_40DACD = off_409004[0][4];
  byte_40DACE = off_409010[0][6];
  byte_40DACF = off_409010[0][4];
  byte_40DAD0 = off_409004[0][2];
  byte_40DAD1 = 95;
  byte_40DAD2 = off_409010[0][6];
  result = *((unsigned __int8 *)off_409008[0] + 3);
  byte_40DAD3 = off_409008[0][3];
  byte_40DAD4 = 0;
  return result;
}

但是上面代码中的result并不是我们要的flag,而是byte_40DAC0数组。解密方法有两种,一种是动态的就是在上面的代码中下断点,另一种是通过静态分析,用python改写上面的代码:

cpp 复制代码
off_409004 = "Andromeda".encode('utf-8')
off_409008= "Messier".encode('utf-8')
off_40900C = "Sombrero".encode('utf-8')
off_409010  = "Triangulum".encode('utf-8')
off_409014 = "DARK SECRET GALAXY".encode('utf-8')

def __libc_csu_gala():
    byte_40DAC = bytearray(21)  

    byte_40DAC[0] = off_409004[8]
    byte_40DAC[1] = off_409010[7]
    byte_40DAC[2] = off_409008[4]
    byte_40DAC[3] = off_409004[6]
    byte_40DAC[4] = off_409004[1]
    byte_40DAC[5] = off_409008[2]
    byte_40DAC[6] = 95
    byte_40DAC[7] = off_409004[8]
    byte_40DAC[8] = off_409004[3]
    byte_40DAC[9] = off_40900C[5]
    byte_40DAC[10] = 95
    byte_40DAC[11] = off_409004[8]
    byte_40DAC[12] = off_409004[3]
    byte_40DAC[13] = off_409004[4]
    byte_40DAC[14] = off_409010[6]
    byte_40DAC[15] = off_409010[4]
    byte_40DAC[16] = off_409004[2]
    byte_40DAC[17] = 95
    byte_40DAC[18] = off_409010[6]

    byte_40DAC[19] = off_409008[3]
    byte_40DAC[20] = 0

    return byte_40DAC.decode('utf-8')  

result = __libc_csu_gala()
print(result)
相关推荐
是真的小外套5 小时前
第13章:网络安全漏洞防护原理与应用
安全·web安全·php
Ikalus19886 小时前
检查自己写着「这不会让任务失败」:一条 Critical 风险就这么过了 178 天
安全·架构
仿生joe会梦见漫天的大雪吗7 小时前
CTF Misc 工具选型指南:按题型分类的工具、原理与限制
后端·安全
QYR-分析7 小时前
工业安全无线遥控器:5.4% 稳步增长,起重与移动机械的安全控制终端
安全
研发小能9 小时前
金融行业 DevSecOps 解决方案:把安全内建到研发全流程
安全·金融·devops·嘉为蓝鲸
xjxijd10 小时前
AI 安全进入爆发周期:智能体安全成下一阶段核心竞争高地
人工智能·安全·ai
数字化转型分享点滴11 小时前
机加工MES落地先连设备还是先上工单?一份车间实施参考
python·安全
橙色云-智橙协同研发12 小时前
汽车零部件行业:如何应对主机厂的严苛审核?
大数据·运维·服务器·人工智能·安全
Multipath71213 小时前
以多链路聚合为通信底座,让低空飞行器“连得上、传得快、飞得稳、管得住”
网络·5g·安全·智能路由器·实时音视频
IT大白鼠13 小时前
2026年9月至今重大安全漏洞专题报告——国产软件与终端高危漏洞深度解析
安全·漏洞·搜狗