一道简单的Reverse题,由蓝鲸安全平台提供,相关的知识点已经都在之前的文章中介绍过了,所以就当做一次小的练习题。

题目:转子检查,达到足够分数得到flag。地址:https://pan.baidu.com/s/1eqHYMTIpfRR2q3GtUfJCWQ

知识点:程序分析,IDA动态调试

目录

  1. 题目解析
    1. 方法一(IDA静态分析)
    2. 方法二(IDA动态调试)
  2. 总结

题目解析

直接运行程序,要求我们输入密码。

检测程序为ELF64位可执行程序。

方法一(IDA静态分析)

程序内容很简单,要求输入密码后经过函数sub_40074D检查:

进入到此函数,发现该函数定义了两个数组进行判断,v9[]能够在该函数中找到;

因为v5影响v4的值,v4影响着v6的值,而最后判断是v6,所以另一个数组应该是v5

v5 = qword_601080,通过交叉引用发现,该值在main函数中进行了动态分配后进行的复制也就是传递个v5:

在10次的循环中,每次复值4位,第一位m,递增赋值,类似凯撒密码的ROT循环产生了后13位的英文字母,结果就是[m,n,o,p,q,r,s,t,u,v,w,x,y,z]

所以回到检测函数,python还原检查代码为:

1
2
3
4
5
6
7
8
9
10
11
12
def check(password):
v9 = [5,2,7,2,5,6]
v5 = ['m','n','o','p','q','r','s','t','u','v','w','x','y','z']
print v5.index['m']
chk = []
for i in range(6):
chk.append(v5.index(password[i]))
for i in range(6):
if chk[i]==v9[i]:
return 1
else:
return 0

简而言之就是利用动态生成的v5序列作为字典,先用密码在字典中寻找序号,最终比对v9的序号和密码的序号是否一致。

最终简单解密为,直接用v9当做序号去输出v6的内容:

1
2
3
4
v9 = [5,2,7,2,5,6]
v5 = ['m','n','o','p','q','r','s','t','u','v','w','x','y','z']
for i in range(6):
print v5[v9[i]]

答案是rotors

方法二(IDA动态调试)

IDA动态调试的方法就不具体说了,之前有介绍过,当我们利用IDA调试的时候遇到反调问题,程序会进入之个死循环当中。

然后暂停程序,可以直接设置EIP指向main函数后再继续运行,这样跳过反调代码。然后在关键的sub_40074D函数中设置了四个断点进行分析,单步调试,如下图所示:

程序的整个流程是①②③④这个顺序进行的,但我们分析程序形成的思路顺序是①④③②。

总结

题目简单,对之前的知识进行了回顾练习,提高程序的分析能力。