ciscn2020 re

Z3

看到题目的意思就知道是要用z3包,也就是解方程

打开ida,查看方程式

image-20200821110955504.png

在去查看判断

image-20200821111026268.png

发现des和v4做比较,Des是从unk_404020复制过来的,所以

image-20200821111105391.png

查看unk_404020

image-20200821111303716.png

由于v4到v45全是int类型,那么我们的byte404020也得是int类型

用idapython打印这里的数值for i in range(0x30):print(str(hex(Dword(0x404020+i*4)))+',')

获取数据后把方程式添加到z3里,在解方程,转换为字符后在打印输出

from z3 import *
#z3
#idapython提取里面的数据 for i in range(0x30):print(str(hex(Dword(0x404020+i*4)))+',')
v=[0x4f17,
0x9cf6,
0x8ddb,
0x8ea6,
0x6929,
0x9911,
0x40a2,
0x2f3e,
0x62b6,
0x4b82,
0x486c,
0x4002,
0x52d7,
0x2def,
0x28dc,
0x640d,
0x528f,
0x613b,
0x4781,
0x6b17,
0x3237,
0x2a93,
0x615f,
0x50be,
0x598e,
0x4656,
0x5b31,
0x313a,
0x3010,
0x67fe,
0x4d5f,
0x58db,
0x3799,
0x60a0,
0x2750,
0x3759,
0x8953,
0x7122,
0x81f9,
0x5524,
0x8971,
0x3a1d,
0x0,
0x0,
0x0,
0x0,
0x0,
0x0]
#在将数值和公式添加到方程式组里,求解即可
p=Solver()
s=[0]*256
for i in range(256):
s[i]=Int('s['+str(i)+']')
p.add(34 * s[3] + 12 * s[0] + 53 * s[1] + 6 * s[2] + 58 * s[4] + 36 * s[5] + s[6]==v[0])
p.add(27 * s[4] + 73 * s[3] + 12 * s[2] + 83 * s[0] + 85 * s[1] + 96 * s[5] + 52 * s[6]==v[1])
p.add(24 * s[2] + 78 * s[0] + 53 * s[1] + 36 * s[3] + 86 * s[4] + 25 * s[5] + 46 * s[6]==v[2])
p.add(78 * s[1] + 39 * s[0] + 52 * s[2] + 9 * s[3] + 62 * s[4] + 37 * s[5] + 84 * s[6]==v[3])
p.add(48 * s[4] + 14 * s[2] + 23 * s[0] + 6 * s[1] + 74 * s[3] + 12 * s[5] + 83 * s[6]==v[4])
p.add(15 * s[5] + 48 * s[4] + 92 * s[2] + 85 * s[1] + 27 * s[0] + 42 * s[3] + 72 * s[6]==v[5])
p.add(26 * s[5] + 67 * s[3] + 6 * s[1] + 4 * s[0] + 3 * s[2] + 68 * s[6]==v[6])
p.add(34 * s[10] + 12 * s[7] + 53 * s[8] + 6 * s[9] + 58 * s[11] + 36 * s[12] + s[13]==v[7])
p.add(27 * s[11] + 73 * s[10] + 12 * s[9] + 83 * s[7] + 85 * s[8] + 96 * s[12] + 52 * s[13]==v[8])
p.add(24 * s[9] + 78 * s[7] + 53 * s[8] + 36 * s[10] + 86 * s[11] + 25 * s[12] + 46 * s[13]==v[9])
p.add(78 * s[8] + 39 * s[7] + 52 * s[9] + 9 * s[10] + 62 * s[11] + 37 * s[12] + 84 * s[13]==v[10])
p.add(48 * s[11] + 14 * s[9] + 23 * s[7] + 6 * s[8] + 74 * s[10] + 12 * s[12] + 83 * s[13]==v[11])
p.add(15 * s[12] + 48 * s[11] + 92 * s[9] + 85 * s[8] + 27 * s[7] + 42 * s[10] + 72 * s[13]==v[12])
p.add(26 * s[12] + 67 * s[10] + 6 * s[8] + 4 * s[7] + 3 * s[9] + 68 * s[13]==v[13])
p.add(34 * s[17] + 12 * s[14] + 53 * s[15] + 6 * s[16] + 58 * s[18] + 36 * s[19] + s[20]==v[14])
p.add(27 * s[18] + 73 * s[17] + 12 * s[16] + 83 * s[14] + 85 * s[15] + 96 * s[19] + 52 * s[20]==v[15])
p.add(24 * s[16] + 78 * s[14] + 53 * s[15] + 36 * s[17] + 86 * s[18] + 25 * s[19] + 46 * s[20]==v[16])
p.add(78 * s[15] + 39 * s[14] + 52 * s[16] + 9 * s[17] + 62 * s[18] + 37 * s[19] + 84 * s[20]==v[17])
p.add(48 * s[18] + 14 * s[16] + 23 * s[14] + 6 * s[15] + 74 * s[17]+ 12 * s[19] + 83 * s[20]==v[18])
p.add(15 * s[19] + 48 * s[18] + 92 * s[16] + 85 * s[15] + 27 * s[14] + 42 * s[17] + 72 * s[20]==v[19])
p.add(26 * s[19] + 67 * s[17] + 6 * s[15] + 4 * s[14] + 3 * s[16] + 68 * s[20]==v[20])
p.add(34 * s[24] + 12 * s[21] + 53 * s[22] + 6 * s[23]+ 58 * s[25] + 36 * s[26] + s[27]==v[21])
p.add(27 * s[25] + 73 * s[24] + 12 * s[23] + 83 * s[21] + 85 * s[22]+ 96 * s[26] + 52 * s[27]==v[22])
p.add(24 * s[23] + 78 * s[21] + 53 * s[22] + 36 * s[24] + 86 * s[25]+ 25 * s[26] + 46 * s[27]==v[23])
p.add(78 * s[22] + 39 * s[21]+ 52 * s[23] + 9 * s[24] + 62 * s[25] + 37 * s[26]+ 84 * s[27]==v[24])
p.add(48 * s[25] + 14 * s[23] + 23 * s[21] + 6 * s[22] + 74 * s[24]+ 12 * s[26]+ 83 * s[27]==v[25])
p.add(15 * s[26] + 48 * s[25] + 92 * s[23] + 85 * s[22] + 27 * s[21]+ 42 * s[24] + 72 * s[27]==v[26])
p.add(26 * s[26] + 67 * s[24] + 6 * s[22] + 4 * s[21] + 3 * s[23]+ 68 * s[27]==v[27])
p.add(34 * s[31] + 12 * s[28] + 53 * s[29] + 6 * s[30] + 58 * s[32]+ 36 * s[33]+ s[34]==v[28])
p.add(27 * s[32] + 73 * s[31] + 12 * s[30]+ 83 * s[28]+ 85 * s[29] + 96 * s[33]+ 52 * s[34]==v[29])
p.add(24 * s[30] + 78 * s[28] + 53 * s[29] + 36 * s[31] + 86 * s[32] + 25 * s[33]+ 46 * s[34]==v[30])
p.add(78 * s[29] + 39 * s[28] + 52 * s[30] + 9 * s[31] + 62 * s[32]+ 37 * s[33]+ 84 * s[34]==v[31])
p.add(48 * s[32] + 14 * s[30]+ 23 * s[28] + 6 * s[29] + 74 * s[31]+ 12 * s[33]+ 83 * s[34]==v[32])
p.add(15 * s[33] + 48 * s[32] + 92 * s[30] + 85 * s[29] + 27 * s[28]+ 42 * s[31] + 72 * s[34]==v[33])
p.add(26 * s[33] + 67 * s[31] + 6 * s[29] + 4 * s[28] + 3 * s[30]+ 68 * s[34]==v[34])
p.add(34 * s[38] + 12 * s[35] + 53 * s[36] + 6 * s[37] + 58 * s[39]+ 36 * s[40]+ s[41]==v[35])
p.add( 27 * s[39] + 73 * s[38] + 12 * s[37] + 83 * s[35] + 85 * s[36]+ 96 * s[40]+ 52 * s[41]==v[36])
p.add( 24 * s[37] + 78 * s[35] + 53 * s[36] + 36 * s[38] + 86 * s[39]+ 25 * s[40]+ 46 * s[41]==v[37])
p.add(78 * s[36] + 39 * s[35] + 52 * s[37] + 9 * s[38] + 62 * s[39]+ 37 * s[40]+ 84 * s[41]==v[38])
p.add(48 * s[39] + 14 * s[37] + 23 * s[35] + 6 * s[36] + 74 * s[38]+ 12 * s[40] + 83 * s[41]==v[39])
p.add(15 * s[40] + 48 * s[39] + 92 * s[37] + 85 * s[36] + 27 * s[35] + 42 * s[38] + 72 * s[41]==v[40])
p.add(26 * s[40] + 67 * s[38] + 6 * s[36] + 4 * s[35] + 3 * s[37]+ 68 * s[41]==v[41])
p.check()
print(p.model())

s[19] = 52
s[32] = 52
s[9] = 49
s[1] = 108
s[10] = 100
s[31] = 49
s[37] = 101
s[38] = 54
s[0] = 102
s[14] = 54
s[26] = 48
s[28] = 45
s[8] = 55
s[39] = 52
s[21] = 49
s[36] = 102
s[22] = 56
s[17] = 57
s[29] = 54
s[16] = 98
s[2] = 97
s[23] = 45
s[25] = 57
s[3] = 103
s[15] = 51
s[24] = 57
s[11] = 52
s[12] = 51
s[33] = 99
s[35] = 97
s[18] = 45
s[30] = 101
s[40] = 56
s[7] = 49
s[4] = 123
s[5] = 55
s[41] = 125
s[34] = 50
s[27] = 101
s[20] = 101
s[13] = 45
s[6] = 101
#在输出求出来的解
for i in range(0,41):
print(chr(s[i]),end="")

得到flag

image-20200821111529610.png

hyperthreading

这道题有许多的混淆指令,使得工具都无法正常的识别代码,导致许多地方无法正确的f5

首先打开ida,查找字符串,发现主要的部分

image-20200821112019427.png

点击纳入StartAddress函数里面,有许多为识别出的机器码

image-20200821112301551.png

咱们往上看可以发现一个问题,在0x401151这里,他有个jmp跳跃到0x401152的指令,很明显这是混淆指令把这里改为一个nop即可,然后再按C键转换为assembly

image-20200821112329622.png

接着往下看,发现这里也有个类似的指令,重复上面的操作

image-20200821112611151.png

往下看可以看到0CCh,这里我打开了od看了一下就是int3的意思,但我直接给nop掉了

image-20200821112738121.png

然后创建函数f5查看源码

image-20200821113024364.png

查看hHandle的时候,感觉有点奇怪,这里没有分析出来

image-20200821113631557.png

回到最先前的函数,查看loc_401200函数,跟前面的一样有混淆指令,改过来即可

image-20200821113817683.png

如果我没记错的话,当时写的时候还有+0x23然后jumpout的函数,但写wp的时候忘记怎么搞得了。

 

经过以上的分析,我在od里填写了10个'A'出来的全是96,我便猜测其加密方式是(((c<<6)^(c>>2))^0x23)+0x23

image-20200821114100095.png

然后经过这里的验证,证明了自己的猜测

image-20200821114234499.png

s=[0xdd,
0x5b,
0x9e,
0x1d,
0x20,
0x9e,
0x90,
0x91,
0x90,
0x90,
0x91,
0x92,
0xde,
0x8b,
0x11,
0xd1,
0x1e,
0x9e,
0x8b,
0x51,
0x11,
0x50,
0x51,
0x8b,
0x9e,
0x5d,
0x5d,
0x11,
0x8b,
0x90,
0x12,
0x91,
0x50,
0x12,
0xd2,
0x91,
0x92,
0x1e,
0x9e,
0x90,
0xd2,
0x9f,
0x0,
0x0]
i=0
temp=""
while i<len(s):
for j in range(33,127):
if((((((j<<6)^(j>>2))^0x23)+0x23)&255)==s[i]):
i+=1
print(chr(j&127),end="")
break
print(temp)

得到flag

 第三题还得去看看别的师傅的wp,还不知道怎么写

posted @ 2020-08-23 15:37  PYozo_free  阅读(494)  评论(0编辑  收藏  举报