zoukankan      html  css  js  c++  java
  • CG-CTF re部分wp

    将cgctf re部分移到这
    Re
    1,hello re
    没什么可说的,拖进ida,发现几个大数字,用热键r一下,将数字变为字符串,由于是小端,将字符串倒过来就是flag 了
    2,readasm2
    int main(int argc, char const *argv[])
    {
    char input[] = {0x0, 0x67, 0x6e, 0x62, 0x63, 0x7e, 0x74, 0x62, 0x69, 0x6d,
    0x55, 0x6a, 0x7f, 0x60, 0x51, 0x66, 0x63, 0x4e, 0x66, 0x7b,
    0x71, 0x4a, 0x74, 0x76, 0x6b, 0x70, 0x79, 0x66 , 0x1c};
    func(input, 28);
    printf("%s ",input+1);
    return 0;
    }
    题目给了一个asm文件,里面是对func函数的描述,翻译成c语言就是

    void func(char input[],int num)
    {
    int i=1;
    while(i<=num)
    {
    input[i]^=i;
    i++;
    }
    }

    就可以算出flag
    3,wxyvm1
    还是先拖入ida,可以看出函数不难理解,将我们的输入经过sub_4005B6与byte_6010c0转换后与 dword_601060比较后,正确即为flag

     
    c="C4 34 22 B1 d3 11 97 07 DB 37 C4 06 1D FC 5B ED 98 DF 94 D8 B3 84 CC 08"
    with open('wxyvm') as wxy:
        b=wxy.read()
    d=[]
    e=[]
    for i in c.split():
        d.append(int(i,base=16))
    
    for i in b.split():
        e.append(int(i,base=16))
    
    for i in range(5000):
        v0=e[3*(4999-i)]
        v1=e[3*(4999-i)+1]
        v3=e[3*(4999-i)+2]
        if v0==1:
            d[v1]-=v3
        elif v0==2:
            d[v1]+=v3
        elif v0==3:
            d[v1]^=v3
        elif v0==4:
            d[v1]/=v3
        elif v0==5:
            d[v1]^=d[v3]
        else :
            continue
    print(''.join([str(chr(int(i)%128))for i in d]))

    这里的wxyvm文件是byte_6010c0的数据
    运算得到flag


    4,py交易
    题目给了一个.pyc文件,我用了uncompyle6逆向

     
    import base64
    
    def encode(message):
        s = ''
        for i in message:
            x = ord(i) ^ 32
            x = x + 16
            s += chr(x)
    
        return base64.b64encode(s)
    
    
    correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
    flag = ''
    print 'Input flag:'
    flag = raw_input()
    if encode(flag) == correct:
        print 'correct'
    else:
        print 'wrong'

    逻辑很好懂,将函数改一下

    import base64
    correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
    f=base64.b64decode(correct)
    print(f)
    
    def encode(f):
        s = ''
        for i in f:
            x = ord(i) - 16
            x = x ^ 32
            s += chr(x)
        print(s)
    encode(f)

    运行得到flag


    5,maze
    有题目可以猜到是一道迷宫题,拖进ida
    在这里插入图片描述
    的确是迷宫题,用O o . 0作为上下左右。找到题目迷宫部分
    在这里插入图片描述
    在这里插入图片描述
    由这推断到35既#处为终点,将迷宫以每行8个分隔开

     
      ******
    *   *  *
    *** * **
    **  * **
    *  *#  *
    ** *** *
    **     *
    ********
    

    走一遍得到flag

    6,你大概需要一个优秀的mac
    题目给了一个OS X的程序(虽然我用的是Mac,但这题不用Mac也可以做)
    还是拖进ida
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    程序将输入xor六次后与unk_100000ED0对比
    写脚本

     
    with open('mac') as mac:
        v2=mac.read()
    INPUT=[]
    
    for i in v2.split():
        INPUT.append(int(i,base=16))
    print(INPUT)
    
    for i in range(0,10):
        INPUT[i]^=173
    for i in range(10,20):
        INPUT[i]^=190
    for i in range(20,30):
        INPUT[i]^=239
    for i in range(30,40):
        INPUT[i]^=171
    for i in range(40,len(INPUT)):
        INPUT[i]^=239
    for i in range(0,len(INPUT)):
        INPUT[i]^=222
    print(INPUT)
    print(''.join(chr(i)for i in INPUT))

    运行得flag
    7,single
    要求输入一串字符,经过三个函数的考验,
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    可以看出这是一个神奇的数独,将unk_602080取81个数,排成9*9的格式

     
     00 03 00 06 00 00 00 00 00
     06 00 00 00 03 02 04 09 00
     00 09 00 01 00 07 00 06 00
     07 04 06 00 00 00 00 00 00
     00 01 08 00 00 00 06 03 00
     00 00 00 00 00 00 01 04 07
     00 08 00 09 00 04 00 07 00
     00 07 04 02 01 00 00 00 06
     00 00 00 00 00 03 00 01 00
    

    每行每列每九宫格为1-9不同的数,解数独后将最初unk_602080中不为零的数转化为零作为输入,得flag:flag{401095728057800001802040305000321589500479002923586000105060203300008950269750804}

    8,480小时精通c++
    用ida查看main
    在这里插入图片描述
    上面v5后就是加密的flag,在看汇编
    在这里插入图片描述
    在The Encrypted Flag is前有一段nop,大概是加密的函数,在函数表中找,
    在这里插入图片描述
    有个StringEncryptFunction函数
    用gdb
    在这里插入图片描述
    经过之前对_X1C_CG…函数的分析,rdi为处理的数据地址,rsi为数据的字符数
    set $rdi=$rax
    set $rsi=36
    将程序跳转到StringEncryptFunction
    set $rip=0x4224f6
    c
    在这里插入图片描述
    得到flag

  • 相关阅读:
    tp.c
    trace
    一致性哈希算法
    update_dctcp_alpha
    dctcp-ns2-patch
    C++ inheritance: public, private. protected ZZ
    C++ virtual inheritance ZZ
    C++ 类对象的初始化顺序 ZZ
    C++ inheritance examples
    classifier.cc-recv() [ns2.35]
  • 原文地址:https://www.cnblogs.com/harmonica11/p/11365453.html
Copyright © 2011-2022 走看看