• 纯学习sq学长wp没参赛

reverse

Seal

  • die
  • file
    • arm64的Mach-O可执行文件
  • strings
  • ida
    • 异或

Matzs Nightmare

看看字符串,发现有一堆的mruby,这是Ruby语言的轻量级解释器
和题目中的语言,以及题目Matzs都对应上了,因为mruby的开发者就是Matzs团队
最核心的是RITE0300完美对应 mruby 的字节码格式标志,本题就是一个宿主C程序加上了内嵌的mruby的结构
C语言的那部分主要负责启动mruby,把RITE字节码load进去,然后去进行校验
所以我们的核心就是把这个字节码抽出来,然后看清楚检验flag的逻辑,最后求flag
首先抽出来,利用dd就能抽了

  • 看不懂思密达,上ai
int64 start()
{
int64 v0; // x0,一般放返回值/临时寄存器
int64 v1; // x19,callee-saved,常用来存 mrb_state*
int64 v2; // x20,callee-saved,常用来存 mruby 对象
int64 v3; // x0/x21,临时
char _s[256]; // 栈上缓冲区,读用户输入
FILE *_stdinp = stdin; // 宏展开
FILE *_stderrp = stderr; // 宏展开

/* ---------------------------------------------------------- */
puts("Authenticate:");
/* ---------------------------------------------------------- */
if (!fgets(_s, 256, _stdinp)) // 读一行 flag
goto fail;

_s[strcspn(_s, "\n")] = 0; // 去回车
/* ---------------------------------------------------------- */
v0 = sub_10000C450(); // **创建 mrb_state***
if (v0 == 0) // 失败就自杀
goto fail;
v1 = v0; // v1 ← mrb_state*,后面全程用
/* ---------------------------------------------------------- */
v2 = sub_1000163EC(v1, _s); // **把用户输入编译成 Ruby 对象**
// 实际底层:mrb_load_string() /
// mrb_parser_parse() -> generate_code()
/* ---------------------------------------------------------- */
v3 = sub_1000284CE(v1, "$ctx", 4); // **获取全局变量 $ctx**
// 对应 Ruby 层:$ctx = …
/* ---------------------------------------------------------- */
sub_10002C4DA4(v1, v3, v2); // **$ctx = 用户输入编译后的对象**
// 等价 Ruby:$ctx = <你的输入>
/* ---------------------------------------------------------- */
sub_10002A4FC(v1, "RITE0300"); // **把内置字节码载入 VM**
// 参数 "RITE0300" 是 magic,
// 函数内部会把紧跟在
// 字符串常量池后面的
// RITE0300… 字节拷出来,
// mrb_read_irep() → load irep
/* ---------------------------------------------------------- */
sub_10000C3F8(v1); // **mrb_close(),销毁 VM**
return 0;

fail:
fwrite("Fatal: Context initialization failed.\n", 0x26, 1, _stderrp);
exit(1);
}

alt text
alt text

  • ok大致了解了
  • 找OFFSET:grep -oba "RITE0300" matzs
  • 找SIZE:第0x08–0x0B这4个字节
  • dd:
OFFSET=450208 
SIZE=1118
dd if=matzs of=code.mrb bs=1 skip=$OFFSET count=$SIZE`
  • 得到code.mrb字节码
  • 看看信息和指令:mruby -v -d code.mrb
  • 哇哦完全看不懂的字节码
  • 实战直接扔ai好了

Misc

Game

  • 在windows事件查看器中查看evtx⽂件
  • lovelymem自带命令行工具 EvtxECmd.exe