angr - re - ais3_crackme

程序拖入64位IDA,邏輯很簡單,flag是argv[1],verify是檢查函數,輸入key長度是23

先說不用angr的做法:需要自己把數據扣出來,按照題目中的算法去逆向算(當然因爲數少,也可以爆破)

扣數據的代碼:

for i in xrange(0x601020, 0x601037):
	print hex(Byte(i)),',',
print

然後是爆破的代碼:

ans = [0xca , 0x70 , 0x93 , 0xc8 , 0x6 , 0x54 , 0xd2 , 0xd5 , 0xda , 0x6a , 0xd1 , 0x59 , 0xde , 0x45 , 0xf9 , 0xb5 , 0xa6 , 0x87 , 0x19 , 0xa5 , 0x56 , 0x6e , 0x63]
#print len(ans)
flag = ''
for i in xrange(23):
	for j in xrange(128):
		#num1 = (((j ^ i) % 0x100) << ((i ^ 9) & 3)) % 0x100
		num1 = ((j ^ i) << ((i ^ 9) & 3)) % 0x100
		num2 = ((j ^ i) >> (8 - ((i ^ 9) & 3))) % 0x100
		num = (num1 | num2) % 0x100
		if ans[i] == num + 8:
			print i,chr(j)
			flag += chr(j)
			break
print flag

得到如下的結果:

0 a
1 i
2 s
3 3
5 I
6 _
7 t
8 a
9 k
10 3
11 _
12 g
13 0
14 0
15 d
16 _
17 n
18 0
19 t
20 3
21 s
22 }
ais3I_tak3_g00d_n0t3s}

然而還不是完整的,尷尬,可見自己寫確實很麻煩

 

用angr的方法:添加限制條件

(1)長度是23

(2)可行路徑位置是0x400602

#!/usr/bin/env python
# coding=utf-8

import angr
import claripy
project = angr.Project("./ais3_crackme")
argv1 = claripy.BVS("argv1", 24 * 8)
initial_state = project.factory.entry_state(args=["./ais3_crackme", argv1])
sm = project.factory.simulation_manager(initial_state)
sm.explore(find = 0x400602)
found = sm.found[0]
solution = found.solver.eval(argv1, cast_to = str)
print solution

每行代碼具體解釋如下:

project = angr.Project("./ais3_crackme")

選擇需要分析的二進制文件

 

argv1 = claripy.BVS("argv1",100*8)

新建一個長度爲100的向量,用來爆破

 

initial_state = project.factory.entry_state(args=["./crackme1",argv1])

定義爆破入口點,參數是argv1

 

sm = project.factory.simulation_manager(initial_state)

新建模擬器

 

sm.explore(find=0x400602)

根據IDA的分析,這裏是輸出correct的正確分支,讓程序執行到此即可

 

found = sm.found[0]

solution = found.solver.eval(argv1, cast_to=str)

print solution

輸出結果即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章