工具
IDA+STL知识
思路展开
复杂语句,大量的C++ STL语句,vector容器等相关概念。
动态调试
整体梳理一遍逻辑:
16个整型输入
生成16个斐波那契数(这里和上面的16 个输入对应起来)
输入经过transform和accumulate两个函数运算出结果
运算出的结果与斐波那契前16 个比较,不相等则错误。
斐波那契前16 个数是公开的,搞清楚transform和accumulate在干什么,逆推输入就可。
动调下断点:这几个函数和最终判断环环相扣,在这两个函数和最后的关键判断下断点,看输入就知道上一个操作在干什么。
输入
100 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
transform:
从第二个数开始每一个数都加上第一个数。
accumulate
逆序
脚本
fib = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987][::-1]
for i in range(1,len(fib)):
print (fib[i]-fib[0])
求出输入再输入就出flag
flag{987-377-843-953-979-985}
静态分析
c++逆向题代码很多,如何找到关键:
push_back() 在Vector最后添加一个元素(参数为要插入的值)
Iterator(迭代器),迭代器的作用:遍历字符
(back_inserter(尾部插),inserter(插入指定位置),front_inserter(头部插))
本题中大量迭代器的使用,真正的函数只有transform和accumulate,看到这里整体就明朗了。
0x01输入
push_back() 在Vector最后添加一个元素(参数为要插入的值)
输入16个整型放到v24 Vector容器。
0x02生成16个斐波那契数
生成16个斐波那契数放到fibs Vector容器。
0x03.transform
点开可以看到一大堆iterator相关的代码,但关键是其中的lambda函数,也就是关键的一元操作。
lamda
简单的加法,再结合下面的
operator的自加,就是后面的15个数,都加上第一个数,再返回。
0x04.accumulate
accumulate点进去,关键也在lambda
点进去lambda
操作的地方只有copy函数,函数一层套着一层的变量相互赋值,这里一定要做好注释,你会发现是尾部赋值给头部,就是逆序
0x05.脚本破解
fib = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987][::-1]
for i in range(1,len(fib)):
print (fib[i]-fib[0])
求出输入再输入就出flag
flag{987-377-843-953-979-985}
总结
c++题目代码多,但逻辑总会出的简单