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

  • 相关阅读:
    在使用npm打包时报错 Tip: built files are meant to be served over an HTTP server. Opening index.html over file:// won't work.
    Vue报错:Property or method "XXX" is not defined on the instance but referenced during render. Make sure that this property is reactive...
    Vue(一)
    使用transform属性和animation属性制作跳动的心
    CSS选择器(通配符选择器、标签选择器、类选择器、id选择器、群组选择器、后代选择器、子元素选择器和相邻元素选择器)
    bootstrap之响应式布局
    Object 对象(对象的分类、属性(属性名和属性值)、基本数据类型与引用数据类型区别)
    HTML5的新变化
    主流浏览器内核(IE、Chrome、Firefox、Safari、Opera)
    语句:if语句、do-while语句、while语句、for语句、for-in语句、with语句、label语句、switch语句以及break和continue语句;
  • 原文地址:https://www.cnblogs.com/harmonica11/p/11365453.html
Copyright © 2011-2022 走看看