Bugku ez fibon

解题前:不知道题目里的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计算过程使用的该值

jv8v9
-11
012
132
235
385

所以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,注意去除最后的逗号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值