调用64位代码的32位程序逆向

教程

关于如何从32位程序中dump出64位函数,我就不赘述了,上面的文章已经说的很详尽了。

dump出的64位函数(大致意义上重命名了一些函数,可能有错误):

对{}中内容的check是以方程组的形式,这里使用了z3求解得到答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from z3 import *
a1=[BitVec('a1%d'%i,8) for i in range(11)]
solver=Solver()
solver.add(a1[4] ^ a1[2] ^ a1[6] == 119)
solver.add((a1[1] ^ a1[0] ^ a1[3]) == 54)
solver.add(a1[10] + a1[3] == 85)
solver.add(a1[2] + a1[9] == 219)
solver.add(a1[4] + a1[5] == 158)
solver.add(a1[2] + a1[1] + a1[5] == 196)
solver.add(a1[8] + a1[7] + a1[9] == 194)
solver.add(a1[5] + a1[3] + a1[9] == 190)
solver.add(a1[6] + a1[2] + a1[8] == 277)
solver.add(a1[10] + a1[1] + a1[7] == 124)
solver.add(a1[5] == 48)
solver.add(a1[10] == 53)
solver.add(a1[7] ^ a1[6] ^ a1[8] == 96)
if solver.check() == sat:
m = solver.model()
s=[]
for i in range(11):
s.append(m[a1[i]].as_long())
print ''.join([chr(i) for i in s])
# 1'm n0t 4n5

因为存在异或操作,所以定义变量时使用了BitVec。

1
parallels@parallels-vm:~$ '/home/parallels/64-32-1.' 
input_code: hwbctf{1'm n0t 4n5}
you got it

做完了才发现这道题和最开始的链接里说的是一道题2333

文章目录
|