其他分享
首页 > 其他分享> > buu练题记录5-[ACTF新生赛2020]Universe_final_answer

buu练题记录5-[ACTF新生赛2020]Universe_final_answer

作者:互联网

0x00 查壳

image-20210414161946081

没有壳,是ELF文件,上IDA64

0x01 IDA分析

在函数列表很容易可以找到main函数,查看的确是关键函数:

image-20210414162244504

这里有且只调用了sub_860和sub_C50两个函数,当sub_860返回真值就能输出flag,所以先分析sub_860:

bool __fastcall sub_860(char *a1)
{
  int v1; // ecx
  int v2; // esi
  int v3; // edx
  int v4; // er9
  int v5; // er11
  int v6; // ebp
  int v7; // ebx
  int v8; // er8
  int v9; // er10
  bool result; // al
  int v11; // [rsp+0h] [rbp-38h]

  v1 = a1[1];
  v2 = *a1;
  v3 = a1[2];
  v4 = a1[3];
  v5 = a1[4];
  v6 = a1[6];
  v7 = a1[5];
  v8 = a1[7];
  v9 = a1[8];
  result = 0;
  if ( -85 * v9 + 58 * v8 + 97 * v6 + v7 + -45 * v5 + 84 * v4 + 95 * v2 - 20 * v1 + 12 * v3 == 12613 )
  {
    v11 = a1[9];
    if ( 30 * v11 + -70 * v9 + -122 * v6 + -81 * v7 + -66 * v5 + -115 * v4 + -41 * v3 + -86 * v1 - 15 * v2 - 30 * v8 == -54400
      && -103 * v11 + 120 * v8 + 108 * v7 + 48 * v4 + -89 * v3 + 78 * v1 - 41 * v2 + 31 * v5 - (v6 << 6) - 120 * v9 == -10283
      && 71 * v6 + (v7 << 7) + 99 * v5 + -111 * v3 + 85 * v1 + 79 * v2 - 30 * v4 - 119 * v8 + 48 * v9 - 16 * v11 == 22855
      && 5 * v11 + 23 * v9 + 122 * v8 + -19 * v6 + 99 * v7 + -117 * v5 + -69 * v3 + 22 * v1 - 98 * v2 + 10 * v4 == -2944
      && -54 * v11 + -23 * v8 + -82 * v3 + -85 * v2 + 124 * v1 - 11 * v4 - 8 * v5 - 60 * v7 + 95 * v6 + 100 * v9 == -2222
      && -83 * v11 + -111 * v7 + -57 * v2 + 41 * v1 + 73 * v3 - 18 * v4 + 26 * v5 + 16 * v6 + 77 * v8 - 63 * v9 == -13258
      && 81 * v11 + -48 * v9 + 66 * v8 + -104 * v6 + -121 * v7 + 95 * v5 + 85 * v4 + 60 * v3 + -85 * v2 + 80 * v1 == -1559
      && 101 * v11 + -85 * v9 + 7 * v6 + 117 * v7 + -83 * v5 + -101 * v4 + 90 * v3 + -28 * v1 + 18 * v2 - v8 == 6308 )
    {
      result = 99 * v11 + -28 * v9 + 5 * v8 + 93 * v6 + -18 * v7 + -127 * v5 + 6 * v4 + -9 * v3 + -93 * v1 + 58 * v2 == -1697;
    }
  }
  return result;
}

这里就是对输入的v5进行效验,核心是输入的10个字符满足这个十元一次方程组即可。这里解这个方程组用暴力算法比较废时间而且不大可能。所以我们需要用到python的z3库

0x02 安装z3库

pip install z3-solver

z3-install

安装成功之后就可以写exp解input了

z3使用教程:Z3Py教程(翻译)

0x03 exp

from z3 import *

F = [Int('F[%d]' % i) for i in range(10)]

s = Solver()
s.add(-85 * F[8] + 58 * F[7] + 97 * F[6] + F[5] + -45 * F[4] + 84 * F[3] + 95 * F[0] - 20 * F[1] + 12 * F[2] == 12613)
s.add(30 * F[9] + -70 * F[8] + -122 * F[6] + -81 * F[5] + -66 * F[4] + -115 * F[3] + -41 * F[2] + -86 * F[1] - 15 * F[0] - 30 * F[7] == -54400)
s.add(-103 * F[9] + 120 * F[7] + 108 * F[5] + 48 * F[3] + -89 * F[2] + 78 * F[1] - 41 * F[0] + 31 * F[4] - (F[6] * 64) - 120 * F[8] == -10283)
s.add(71 * F[6] + (F[5] * 128) + 99 * F[4] + -111 * F[2] + 85 * F[1] + 79 * F[0] - 30 * F[3] - 119 * F[7] + 48 * F[8] - 16 * F[9] == 22855)
s.add(5 * F[9] + 23 * F[8] + 122 * F[7] + -19 * F[6] + 99 * F[5] + -117 * F[4] + -69 * F[2] + 22 * F[1] - 98 * F[0] + 10 * F[3] == -2944)
s.add(-54 * F[9] + -23 * F[7] + -82 * F[2] + -85 * F[0] + 124 * F[1] - 11 * F[3] - 8 * F[4] - 60 * F[5] + 95 * F[6] + 100 * F[8] == -2222)
s.add(-83 * F[9] + -111 * F[5] + -57 * F[0] + 41 * F[1] + 73 * F[2] - 18 * F[3] + 26 * F[4] + 16 * F[6] + 77 * F[7] - 63 * F[8] == -13258)
s.add(81 * F[9] + -48 * F[8] + 66 * F[7] + -104 * F[6] + -121 * F[5] + 95 * F[4] + 85 * F[3] + 60 * F[2] + -85 * F[0] + 80 * F[1] == -1559)
s.add(101 * F[9] + -85 * F[8] + 7 * F[6] + 117 * F[5] + -83 * F[4] + -101 * F[3] + 90 * F[2] + -28 * F[1] + 18 * F[0] - F[7] == 6308)
s.add(99 * F[9] + -28 * F[8] + 5 * F[7] + 93 * F[6] + -18 * F[5] + -127 * F[4] + 6 * F[3] + -9 * F[2] + -93 * F[1] + 58 * F[0] == -1697)

Input = []
if s.check() == sat:
    result = s.model()
for i in F:
    Input.append(chr(eval(str(result[i]))))
print(''.join(Input))

运行得到input,既v5

image-20210414164340466

后面的sub_C50函数就可以直接跳过不分析,把文件甩进虚拟机直接运行即可得到flag

image-20210414164857777

到此,此题解完。

其实我也有想着把sub_C50分析一下也用exp写出解,但是相比于直接运行,就有些费时费力了,而且过多的往算法里面钻就有点偏离玩破解的本意了,不如干脆去研究算法算了。这里只是个人的一点见解,要是有大佬写了exp的可以在我下面评论我好康(bai)康(piao)。嘿嘿~

标签:sub,int,Universe,buu,a1,add,练题,v5,85
来源: https://blog.csdn.net/qq_45892237/article/details/115710522