• 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,还不知道怎么写

  • 相关阅读:
    77. Combinations
    319. Bulb Switcher
    222.Count Complete Tree Nodes
    842.Split Array into Fibonacci Sequence
    306.Additive Number
    747.Largest Number At Least Twice of Others
    并查集
    HDU-3371 Connect the Cities
    HDU-1863 畅通工程
    HDU-1879 继续畅通工程
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/13549364.html
Copyright © 2020-2023  润新知