ciscn2020-初赛-reverse-writeup
z3
检查一下:

IDA64打开:main函数
1 | // local variable allocation has failed, the output may be wrong! |
查看unk_404020

注意此处是小端存储
总的说来就是解那一大块线性方程组,用z3就可以解出
脚本写的不好,这里附上别人写的
1 | c = "17 4F 00 00 F6 9C 00 00 DB 8D 00 00 A6 8E 00 00 29 69 00 00 11 99 00 00 A2 40 00 00 3E 2F 00 00 B6 62 00 00 82 4B 00 00 6C 48 00 00 02 40 00 00 D7 52 00 00 EF 2D 00 00 DC 28 00 00 0D 64 00 00 8F 52 00 00 3B 61 00 00 81 47 00 00 17 6B 00 00 37 32 00 00 93 2A 00 00 5F 61 00 00 BE 50 00 00 8E 59 00 00 56 46 00 00 31 5B 00 00 3A 31 00 00 10 30 00 00 FE 67 00 00 5F 4D 00 00 DB 58 00 00 99 37 00 00 A0 60 00 00 50 27 00 00 59 37 00 00 53 89 00 00 22 71 00 00 F9 81 00 00 24 55 00 00 71 89 00 00 1D 3A 00 00".split() |
正则匹配:
1 | import numpy as np |
hyperthreading
放进 IDA 里反编译查看一下,发现与 z3 类似是将输入进行变换后比较。大致查看变换 过程,可见是以一个字符为变换单元。 使用 ollydbg 进行动态调试,输入数字和小写字母。在最后的比较处下断点,然后在查 看内存中相应的数据,可以得到输入的数字、字母和输出的数据的对应关系,以及目 标数据。图中最上面是目标数据,第二部分是数字 0-9 对应的输出,第三部分是小写 字母 a-z 对应的输出,最后是大写字母(题目中未出现)。代入目标数据得到大部分 结果,猜测 20 和 9F 分别对应{和},在输入特殊字符尝试,得到 8B 对应的输入应该是 -。
脚本:
1 | ciper = [ |
