2018 ”2018网鼎杯-blend

Author Avatar
Xzhah 9月 03, 2018
  • 在其它设备中阅读本文章

题目

题目是csaw2017的原题,icq是不是没钱买题了。。。

这是一个mbr的逆向,拖进ida后需要注意rebase为0x7c00,16进制。

调试

1.ida+vm

打开虚拟机文件夹,编辑vmx文件,加上这三条

debugStub.listen.guest=”TRUE”
debugStub.hideBreakpoints=”TRUE”
bios.bootDelay=”8000”

(8000就是延迟8秒给你attach的时间,根据手速而定)

vm选择虚拟机->设置->添加->添加软盘驱动器->使用软盘映像,然后选择mbr就行了

(有可能软盘加载顺序在硬盘之后,进入bios设置里去调整一下就好了,我的默认是在最前就不用)

IDA工具栏选择Debugger->Attach,ip为localhost,端口为8832

调试效果如上

2.qemu调试

先运行命令qemu-system-i386 -s -drive format=raw,file=./main (main是文件名)

gdb 输入命令set architecture i8086,set disassembly-flavor intel,target remote:1234

静态分析

当输入>19位过后,对比前四位是否是flag

然后进入以下对比逻辑

查询一下sse指令就能摸懂逻辑了

然后用z3求解

脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/env python

from z3 import *

def get_models(s):
while s.check() == sat:
m = s.model()
yield m
s.add(Or([sym() != m[sym] for sym in m.decls()]))

s = Solver()


a = Int('a')
b = Int('b')
c = Int('c')
d = Int('d')
e = Int('e')
f = Int('f')
g = Int('g')
h = Int('h')
i = Int('i')
j = Int('j')
k = Int('k')
l = Int('l')
m = Int('m')
n = Int('n')
o = Int('o')
p = Int('p')




def abs(x):
return If(x>=0,x,-x)

s.add(And(0x20 < a, a < 0x7f))
s.add(And(0x20 < b, b < 0x7f))
s.add(And(0x20 < c, c < 0x7f))
s.add(And(0x20 < d, d < 0x7f))
s.add(And(0x20 < e, e < 0x7f))
s.add(And(0x20 < f, f < 0x7f))
s.add(And(0x20 < g, g < 0x7f))
s.add(And(0x20 < h, h < 0x7f))
s.add(And(0x20 < i, i < 0x7f))
s.add(And(0x20 < j, j < 0x7f))
s.add(And(0x20 < k, k < 0x7f))
s.add(And(0x20 < l, l < 0x7f))
s.add(And(0x20 < m, m < 0x7f))
s.add(And(0x20 < n, n < 0x7f))
s.add(And(0x20 < o, o < 0x7f))
s.add(And(0x20 < p, p < 0x7f))

# from PIN trace
s.add(abs(d-0x22)+abs(c-0xf)+abs(b-0x2)+abs(a-0xc8)+abs(h-0x83)+abs(g-0xfb)+abs(f-0xe0)+abs(0-0x83)==0x304)
s.add(abs(p-0xc0)+abs(o-0x20)+abs(n-0xf)+abs(m-0x10)+abs(l-0xcd)+abs(k-0x0)+abs(j-0x13)+abs(0-0xb8)==0x311)
s.add(abs(d-0x0)+abs(c-0x0)+abs(b-0x0)+abs(a-0x0)+abs(h-0x0)+abs(g-0x0)+abs(0-0x3)+abs(e-0x04)==0x2cd)
s.add(abs(p-0x0)+abs(o-0x00)+abs(n-0x0)+abs(m-0x0)+abs(l-0x0)+abs(k-0x0)+abs(0-0x3)+abs(i-0x11)==0x2d9)
s.add(abs(d-0x0)+abs(c-0x0)+abs(b-0x0)+abs(a-0x0)+abs(h-0x0)+abs(0-0x0)+abs(f-0x2)+abs(e-0xcd)==0x2db)
s.add(abs(p-0x0)+abs(o-0x00)+abs(n-0x0)+abs(m-0x0)+abs(l-0x0)+abs(0-0x0)+abs(j-0x2)+abs(i-0xd9)==0x2d4)
s.add(abs(d-0x0)+abs(c-0x0)+abs(b-0x0)+abs(a-0x0)+abs(0-0x0)+abs(g-0x0)+abs(f-0x2)+abs(e-0xdb)==0x2e2)
s.add(abs(p-0x0)+abs(o-0x00)+abs(n-0x0)+abs(m-0x0)+abs(0-0x0)+abs(k-0x0)+abs(j-0x2)+abs(i-0xd4)==0x2c4)
s.add(abs(d-0x0)+abs(c-0x0)+abs(b-0x0)+abs(0-0x0)+abs(h-0x0)+abs(g-0x0)+abs(f-0x2)+abs(e-0xe2)==0x2e2)
s.add(abs(p-0x0)+abs(o-0x00)+abs(n-0x0)+abs(0-0x0)+abs(l-0x0)+abs(k-0x0)+abs(j-0x2)+abs(i-0xc4)==0x2ce)
s.add(abs(d-0x0)+abs(c-0x0)+abs(0-0x0)+abs(a-0x0)+abs(h-0x0)+abs(g-0x0)+abs(f-0x2)+abs(e-0xe2)==0x2ed)
s.add(abs(p-0x0)+abs(o-0x00)+abs(0-0x0)+abs(m-0x0)+abs(l-0x0)+abs(k-0x0)+abs(j-0x2)+abs(i-0xce)==0x2d8)
s.add(abs(d-0x0)+abs(0-0x0)+abs(b-0x0)+abs(a-0x0)+abs(h-0x0)+abs(g-0x0)+abs(f-0x2)+abs(e-0xed)==0x2e8)
s.add(abs(p-0x0)+abs(0-0x00)+abs(n-0x0)+abs(m-0x0)+abs(l-0x0)+abs(k-0x0)+abs(j-0x2)+abs(i-0xd8)==0x2dc)
s.add(abs(0-0x0)+abs(c-0x0)+abs(b-0x0)+abs(a-0x0)+abs(h-0x0)+abs(g-0x0)+abs(f-0x2)+abs(e-0xe8)==0x2f6)
s.add(abs(0-0x0)+abs(o-0x00)+abs(n-0x0)+abs(m-0x0)+abs(l-0x0)+abs(k-0x0)+abs(j-0x2)+abs(i-0xdc)==0x2dd)
print s.check()
for m1 in get_models(s):
serial = [m1[a].as_long(), m1[b].as_long(), m1[c].as_long(), m1[d].as_long(),
m1[e].as_long(), m1[f].as_long(), m1[g].as_long(), m1[h].as_long(),
m1[i].as_long(), m1[j].as_long(), m1[k].as_long(), m1[l].as_long(), m1[m].as_long(), m1[n].as_long(),m1[o].as_long(),m1[p].as_long()]

key = ''
for _ in serial: key+=chr(_)
print key

结果