Re1-easyCpp
IDA打开发现一大堆模板很丑,但仔细看一下其实只有一堆变量来回操作而已
基本上就是各种STL和vector的用法,算法名都保留下来了所以难度下降很多
基本流程是接收输入、生成斐波那契数列的十六项
然后对输入依次使用transform和accumulate算法
分别是遍历vector中的一元运算和二元运算
运算都是自定义的方法,双击算法进去可以看到lambda函数
transform的运算是累加第0个元素
accumulate则是通过back_inster迭代器将容器逆序
所以最终结果只要保证生成数组等于fib数列即可
但其实直接动态调试,黑盒的方法很容易看出来两次算法变换的内容,而无需去关注复杂的STL
fib = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987][::-1]
x = fib[0]
for i in range(len(fib)):
print(0xffffffff&(fib[i]-fib[0]))
Re2-testre
核心函数中混有一个没有用的数组,最后比较仅用到另一个数组
生成方法是逐个字节遍历,每个字节模58的余数放在结果数组中,再整除58后移一位,直到整除58为0为止
最后用长为58的表转为可见字符
这里的算法有点绕,最好自己动态调试跟着走一遍,观察变量的值,自己写算法复刻一下比较
这里的d1是结果数组,d2没有意义无需看
关键是v21和break的条件
复刻出来长这样
比赛的时候想解方程结果眼瞎输错了数字,抱着侥幸心理试了一下base58,结果直接就出来了
>>>
base58.b58decode(b"D9cS9N9iHjMLTdA8YSMRMp")
b’base58_is_boring’
后来回头观察了一下发现是眼瞎的问题,重修了一下方程就OK了
这里根据数据可以发现第一轮循环中倒数三个数分别为t=a[0]
t%58
, t/58%58
, t/58/58%58
第二轮则可化简为t = a[0]<<8 + a[1]
的状态下
t%58