解题前:不知道题目里的fibon是啥意思,百度了一下发现就是大名鼎鼎的斐波那契数列
1.使用exeinfo先查看一下文件
提示使用了upx压缩过,遂下载upxhttps://github.com/upx/upx/releases
2.还原文件(还原后会替换掉原文件,可以对比下还原前后文件大小)
将解压后的文件拖到IDA64,并反编译一下,得到如下结果
3.分析下发现,“*(_DWORD *)&Str[4 * i + 112]”长这样的东西其实就是个数组。20~34行在对输入的数据进行转换以在58~62行与v5数组进行比对。
分析下20~34行的逻辑,发现通过24行判断奇偶的逻辑,if和else是交替进行的,且执行的都是“(v8/9 + j + *(_DWORD *)&Str[4 * j + 112]) % 64 + 64”,那么对j、v8、v9的关系进行一下模拟计算,发现就是一个斐波那契数列的计算过程(扣题了),下表v8、v9列加粗加下划线表示当j为对应值时v3计算过程使用的该值
j | v8 | v9 |
---|---|---|
- | 1 | 1 |
0 | 1 | 2 |
1 | 3 | 2 |
2 | 3 | 5 |
3 | 8 | 5 |
所以v3计算过程使用到的斐波那契数列为[2, 3, 5, 8, …]
我们假设答案是flag[],上述斐波那契数列存储在fibon[],那么下面式子是成立的
v5[i] == ( fibon[i] + i + flag[i] ) % 64 + 64
经过一番瞎想(是的,我忘了怎么证明了,全靠俺寻思),得到如下结论
flag[i] % 64 == ( v5[i] - 64 - fibon[i] - i ) % 64
4.那么直接敲代码就好了,下面是我的python代码
v5 = [100, 121, 110, 118, 70, 85, 123, 109, 64, 94, 109, 99, 116, 81, 109, 86, 83, 126, 119, 101, 110, 114]
fibon = [2, 3]
# 补充计算fibon
for i in range(20):
fibon.append(fibon[i] + fibon[i+1])
# 反求
for i in range(22):
base = v5[i] - 64 - fibon[i] - i # 尝试得到变形的flag值,该值与正确flag值相差n个64
while base < 64: # 断言flag ASCII大于等于64
base += 64
print(chr(base), end='')
注意中间有个断言说所有flag字符的ASCII值都大于等于64,我觉得可以通过v3的值大于等于64来得到这点“暗示”。
运行代码得到结果bugku{So_Ez_Fibon@cci}
额外内容
敲反解代码的时候遇到的第一个问题就是把v5序列摘出来,一个一个复制是不可能的,看到36~57行数据这么整齐,遂决定用我拿手的excel进行内容提取
首先把内容粘到excel里
然后进行分列操作,分隔符设置为空格
然后进行替换操作,把“;”全部替换为“, ”
在E1单元格填写“=D1”,然后在E2单元格填写“=E1&D2”,再把E2单元格下拉填充即可在最后一行得到v5,注意去除最后的逗号