[MRCTF2020]VirtualTree

buu 附件提供了源码,打开直接 flag 糊脸,建议装作没有看见并关掉

载入 IDA 查看 main 函数

规定输入长度 16,有两个函数 sub_401680 和 sub_4016F0,先进入 sub_401680 看看

有个异或,a1,a1+4,a1+8 看起来也像个二叉树,先不管他,看看 sub_4016F0,发现这一片存在一部分花指令

patch byte 将 E8 改为 90,然后把数据强制转换为代码,全部修改过后就可以看到代码了

看不太懂都是些啥,动调一下,却发现这些函数都改变了

这些函数就好理解多了,sub_4014E0 是 Input[a1] += a2

sub_4C1470 是 Input[a1] ^= Input[a2]

sub_4C14A0 是 Input[a1] = abs(Input[a1] - Input[a2])

可以得到函数整体进行的操作如下

这个函数结束后会与 byte_4E08EC 数组进行比较

回到进行异或操作的函数里,设置输入为 16 个 0,动调得到异或的每一个数字

运行几次得到

0x4D, 0x4C, 0x47, 0x50, 0x4F, 0x4B, 0x46, 0x43,
0x4A, 0x45, 0x4E, 0x49, 0x48, 0x44, 0x42, 0x41

写脚本

#include <bits/stdc++.h>
using namespace std;
int a[17] = {
  0x4D, 0x4C, 0x47, 0x50, 0x4F, 0x4B, 0x46, 0x43,
  0x4A, 0x45, 0x4E, 0x49, 0x48, 0x44, 0x42, 0x41};
int ans[17] = {
  0x17, 0x63, 0x77, 0x03, 0x52, 0x2E, 0x4A, 0x28,
  0x52, 0x1B, 0x17, 0x12, 0x3A, 0x0A, 0x6C, 0x62};
void sub_4C14E0(int a1, int a2) {
  ans[a1] -= a2;
  return;
}
void sub_4C1470(int a1, int a2) {
  ans[a1] ^= ans[a2];
  return;
}
void sub_4C14A0(int a1, int a2) {
  if (ans[a1] > ans[a2]) ans[a1] += ans[a2];
  else ans[a1] = ans[a2] - ans[a1];
  return;
}
void work() {  //反过来运行
  sub_4C14E0(15, 2);
  sub_4C1470(14, 15);
  sub_4C14A0(12, 2);
  sub_4C1470(11, 12);
  sub_4C14A0(10, 7);
  sub_4C14A0(9, 8);
  sub_4C1470(8, 7);
  sub_4C14E0(7, 3);
  sub_4C14A0(6, 1);
  sub_4C1470(4, 5);
  sub_4C14A0(3, 7);
  sub_4C14E0(2, 7);
  sub_4C1470(1, 2);
  sub_4C14E0(0, 10);
}
int main() {
  work();
  for (int i = 0; i < 16; i++) {
    int num = ans[i];
    int numm = a[i];
    cout << (char)(num ^ numm);
  }
  return 0;
}

flag{@_7r3e_f0r_fuNN!}

posted @ 2022-07-07 19:47  Moominn  阅读(178)  评论(0编辑  收藏  举报