查壳
无壳,64位Linux程序
放入IDA中分析
查看Main函数
这里拿加密后的用户输入和程序生成的前16个斐波那契数列进行对比
,不相等则退出程序,相等的话则继续往下执行
所以说只需要逆推出input_encry是如何生成的,既可以得到flag
这里是把&input_begin存到&input_encry
从头开始分析&input_begin是如何生成的
这里是把用户输入的字符串首地址放到&one_input中,
one_input_addr也执指向用户输入的字符串首地址
input_end指向用户输入数据的最后一个的地址
input_begin指向用户输入数据的第一个的地址
two_input_addr指向用户输入数据的第二个的地址
跟入transform函数分析函数作用
这个循环是对用户输入的数据第二个开始一直到最后一个,进行加密,详细分析写在图中注释,这个函数实现的功能就是把用户输入的整形数组从第二个开始到最后一个依次加上第一个数字
这里的v7指向用户输入加密后的最后一个字符
这里的v8指向用户输入加密后的第一个字符
接下来分析accumulate函数
通过动态调试分析,发现这个函数是对用户输入加密后的数据进行逆序。
input_encry的生成算法已经基本清晰了
Python实现
# -*- coding: utf-8 -*-
# @Author: 夏了茶糜
# @Date: 2020-03-17 21:42:19
# @email: [email protected]
# @Last Modified by: 夏了茶糜
# @Last Modified time: 2020-03-17 22:20:48
def fibs(n):
if not n or n == 1:
return 1
return fibs(n-1) + fibs(n-2)
tmp = []
for i in range(0,16):
tmp.append(fibs(i))
tmp = tmp[::-1]
print(tmp)
print(tmp[0])
for i in range(1,16):
tmp[i] = tmp[i] - tmp[0]
print(tmp[i])
[987, 610, 377, 233, 144, 89, 55, 34, 21, 13, 8, 5, 3, 2, 1, 1]
987
-377
-610
-754
-843
-898
-932
-953
-966
-974
-979
-982
-984
-985
-986
-986
flag{987-377-843-953-979-985}