zoukankan      html  css  js  c++  java
  • [网鼎杯 2020 青龙组]singal

    vm,没有栈操作,找到opcode

    0A 00 00 00 04 00 00 00  10 00 00 00 08 00 00 00
    03 00 00 00 05 00 00 00  01 00 00 00 04 00 00 00
    20 00 00 00 08 00 00 00  05 00 00 00 03 00 00 00
    01 00 00 00 03 00 00 00  02 00 00 00 08 00 00 00
    0B 00 00 00 01 00 00 00  0C 00 00 00 08 00 00 00
    04 00 00 00 04 00 00 00  01 00 00 00 05 00 00 00
    03 00 00 00 08 00 00 00  03 00 00 00 21 00 00 00
    01 00 00 00 0B 00 00 00  08 00 00 00 0B 00 00 00
    01 00 00 00 04 00 00 00  09 00 00 00 08 00 00 00
    03 00 00 00 20 00 00 00  01 00 00 00 02 00 00 00
    51 00 00 00 08 00 00 00  04 00 00 00 24 00 00 00
    01 00 00 00 0C 00 00 00  08 00 00 00 0B 00 00 00
    01 00 00 00 05 00 00 00  02 00 00 00 08 00 00 00
    02 00 00 00 25 00 00 00  01 00 00 00 02 00 00 00
    36 00 00 00 08 00 00 00  04 00 00 00 41 00 00 00
    01 00 00 00 02 00 00 00  20 00 00 00 08 00 00 00
    05 00 00 00 01 00 00 00  01 00 00 00 05 00 00 00
    03 00 00 00 08 00 00 00  02 00 00 00 25 00 00 00
    01 00 00 00 04 00 00 00  09 00 00 00 08 00 00 00
    03 00 00 00 20 00 00 00  01 00 00 00 02 00 00 00
    41 00 00 00 08 00 00 00  0C 00 00 00 01 00 00 00
    07 00 00 00 22 00 00 00  07 00 00 00 3F 00 00 00
    07 00 00 00 34 00 00 00  07 00 00 00 32 00 00 00
    07 00 00 00 72 00 00 00  07 00 00 00 33 00 00 00
    07 00 00 00 18 00 00 00  07 00 00 00 A7 FF FF FF
    07 00 00 00 31 00 00 00  07 00 00 00 F1 FF FF FF
    07 00 00 00 28 00 00 00  07 00 00 00 84 FF FF FF
    07 00 00 00 C1 FF FF FF  07 00 00 00 1E 00 00 00
    07 00 00 00 7A 00 00 00 
    View Code
    with open("a.txt") as f:
        f=f.read().split()
    a=[]
    for i in range(0,len(f),4):
        a.append(eval("0x"+f[i]))
    #print(a)
    v10=0
    v7=0
    v9=0
    v6=0
    while(v10<len(a)):
        if a[v10] == 1:
            print("1:      v4["+str(v7)+"] = v5;")
            v10+=1
            v7+=1
            v9+=1
            continue
        if a[v10] == 2:
            print("2:      v5 = a1["+str(v10 + 1)+"] + v3["+str(v9)+"];")
            v10 += 2
            continue
        if a[v10] == 3:
            print("3:      v5 = v3["+str(v9)+"] - a1["+str(v10 + 1)+"];")
            v10 += 2
            continue
        if a[v10] == 4:
            print("4:      v5 = a1["+str(v10 + 1)+"] ^ v3["+str(v9)+"];")
            v10 += 2
            continue
        if a[v10] == 5:
            print("5:      v5 = a1["+str(v10 + 1)+"] * v3["+str(v9)+"];")
            v10 += 2
            continue
        if a[v10] == 6:
            print("6:    ")
            v10+=1
            continue
        if a[v10] == 7:
            #print("if ( v4[v8] != a1[v10 + 1] ){printf("what a shame...");exit(0);}++v8;v10 += 2;")
            continue
        if a[v10] == 8:
            print("8:      v3["+str(v6)+"] = v5;")
            v10+=1
            v6+=1
            continue
        if a[v10] == 10:
            print("10:     read(v3)")
            v10+=1
            continue
        if a[v10] == 11:
            print("11:     v5 = v3["+str(v9)+"] - 1;")
            v10+=1
            continue
        if a[v10] == 12:
            print("12:     v5 = v3["+str(v9)+"] + 1;")
            v10+=1
            continue
        else:
            continue

    得到处理过程

    10:     read(v3)
    4:      v5 = a1[2] ^ v3[0];
    8:      v3[0] = v5;
    3:      v5 = v3[0] - a1[5];
    1:      v4[0] = v5;
    
    4:      v5 = a1[8] ^ v3[1];
    8:      v3[1] = v5;
    5:      v5 = a1[11] * v3[1];
    1:      v4[1] = v5;
    
    3:      v5 = v3[2] - a1[14];
    8:      v3[2] = v5;
    11:     v5 = v3[2] - 1;
    1:      v4[2] = v5;
    
    12:     v5 = v3[3] + 1;
    8:      v3[3] = v5;
    4:      v5 = a1[21] ^ v3[3];
    1:      v4[3] = v5;
    
    5:      v5 = a1[24] * v3[4];
    8:      v3[4] = v5;
    3:      v5 = v3[4] - a1[27];
    1:      v4[4] = v5;
    
    11:     v5 = v3[5] - 1;
    8:      v3[5] = v5;
    11:     v5 = v3[5] - 1;
    1:      v4[5] = v5;
    
    4:      v5 = a1[34] ^ v3[6];
    8:      v3[6] = v5;
    3:      v5 = v3[6] - a1[37];
    1:      v4[6] = v5;
    
    2:      v5 = a1[40] + v3[7];
    8:      v3[7] = v5;
    4:      v5 = a1[43] ^ v3[7];
    1:      v4[7] = v5;
    
    12:     v5 = v3[8] + 1;
    8:      v3[8] = v5;
    11:     v5 = v3[8] - 1;
    1:      v4[8] = v5;
    
    5:      v5 = a1[50] * v3[9];
    8:      v3[9] = v5;
    2:      v5 = a1[53] + v3[9];
    1:      v4[9] = v5;
    
    2:      v5 = a1[56] + v3[10];
    8:      v3[10] = v5;
    4:      v5 = a1[59] ^ v3[10];
    1:      v4[10] = v5;
    
    2:      v5 = a1[62] + v3[11];
    8:      v3[11] = v5;
    5:      v5 = a1[65] * v3[11];
    1:      v4[11] = v5;
    
    5:      v5 = a1[68] * v3[12];
    8:      v3[12] = v5;
    2:      v5 = a1[71] + v3[12];
    1:      v4[12] = v5;
    
    4:      v5 = a1[74] ^ v3[13];
    8:      v3[13] = v5;
    3:      v5 = v3[13] - a1[77];
    1:      v4[13] = v5;
    
    2:      v5 = a1[80] + v3[14];
    8:      v3[14] = v5;
    12:     v5 = v3[14] + 1;
    1:      v4[14] = v5;
    View Code

    其实v4的值就是opcode中7后面的值,但我是动调出来的

    "22 3f 34 32 72 33 18 a7 31 f1 28 84 c1 1e 7a"
    v4="22 3f 34 32 72 33 18 a7 31 f1 28 84 c1 1e 7a"
    v4=v4.split()
    a1=[10, 4, 16, 8, 3, 5, 1, 4, 32, 8, 5, 3, 1, 3, 2, 8, 11, 1, 12, 8, 4, 4, 1, 5, 3, 8, 3, 33, 1, 11, 8, 11, 1, 4, 9, 8, 3, 32, 1, 2, 81, 8, 4, 36, 1, 12, 8, 11, 1, 5, 2, 8, 2, 37, 1, 2, 54, 8, 4, 65, 1, 2, 32, 8, 5, 1, 1, 5, 3, 8, 2, 37, 1, 4, 9, 8, 3, 32, 1, 2, 65, 8, 12, 1, 7, 34, 7, 63, 7, 52, 7, 50, 7, 114, 7, 51, 7, 24, 7, 167, 7, 49, 7, 241, 7, 40, 7, 132, 7, 193, 7, 30, 7, 122]
    v3=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    for i in range(len(v4)):
        v4[i]=eval("0x"+v4[i])
    v3[0]=(v4[0]+a1[5])^a1[2]
    v3[1]=(v4[1]//a1[11])^a1[8]
    v3[2]=v4[2]+1+a1[14]
    v3[3]=(v4[3]^a1[21])-1
    v3[4]=(v4[4]+a1[27])//a1[24]
    v3[5]=v4[5]+2
    v3[6]=(v4[6]+a1[37])^a1[34]
    v3[7]=(v4[7]^a1[43])-a1[40]
    v3[8]=v4[8]
    v3[9]=(v4[9]-a1[53])//a1[50]
    v3[10]=(v4[10]^a1[59])-a1[56]
    v3[11]=v4[11]//a1[65]-a1[62]
    v3[12]=(v4[12]-a1[71])//a1[68]
    v3[13]=(v4[13]+a1[77])^a1[74]
    v3[14]=v4[14]-1-a1[80]
    
    for i in v3:
        print(chr(i),end="")

    得到flag

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    做法二:

    最近在学angr

    import angr
    
    def main():
            p=angr.Project("signal.exe",auto_load_libs=False)
            sm=p.factory.simulation_manager(p.factory.entry_state())
            sm.explore(find=0x40179e,avoid=0x4016e6)
            return sm.found[0].posix.dumps(0)
    if __name__=='__main__':
            print(main())
  • 相关阅读:
    Python 从零学起(纯基础) 笔记 之 collection系列
    ARM学习 之 如何在向内核写入系统调用
    idea的git使用案例
    idea使用git的pull命令报错1
    String、StringBuilder以及StringBuffer
    HashMap实现原理及源码分析
    logback使用注意点1
    创建zookeeper集群
    disconf安装问题
    linux更换jdk版本
  • 原文地址:https://www.cnblogs.com/harmonica11/p/12987606.html
Copyright © 2011-2022 走看看