• GeekGame2020_部分WriteUp


    GeekGame2020_部分wp

    写在前面

    这次比赛过程还是很愉快的,没有撕逼,问题也少,感觉比同时间其他几个比赛正规多了,里面不少题也很有意思,感谢辛苦出题的师傅们。我个人感觉涨知识了的题就写下这篇wp,作为记录。

    Reverse

    PY交易

    相关知识:python字节码指令集,python dis模块

    题目描述:众里寻他千百度,PUPU扫描器还是没找到。 作者APU发了一道暗语文本,你知道他在说什么吗?读懂暗语就可以找作者PY下载地址了。
    题目下载链接:https://lanzous.com/icx4gbg
    其实这一题难度不高,但是因为没有合适的工具很费时间。先看pypypypypy.txt:

      1           0 LOAD_NAME                0 (input)
                  2 LOAD_CONST               0 ('please your flag:')
                  4 CALL_FUNCTION            1
                  6 STORE_NAME               1 (inputs)
    
      2           8 LOAD_NAME                1 (inputs)
                 10 LOAD_CONST               1 (7)
                 12 LOAD_CONST              18 (-1)
                 14 BUILD_SLICE              2
                 16 BINARY_SUBSCR
                 18 STORE_NAME               1 (inputs)
    
      3          20 LOAD_CONST               3 ('th31_scuctf_eXclus1v3')
                 22 STORE_NAME               2 (flag)
    
      4          24 LOAD_CONST               4 ('')
                 26 STORE_NAME               3 (theflag)
    
      5          28 LOAD_CONST               5 (0)
                 30 STORE_NAME               4 (i)
    
      6          32 LOAD_CONST               5 (0)
                 34 STORE_NAME               5 (j)
    
      7          36 LOAD_NAME                6 (print)
                 38 LOAD_NAME                2 (flag)
                 40 LOAD_CONST               5 (0)
                 42 BINARY_SUBSCR
                 44 CALL_FUNCTION            1
                 46 POP_TOP
    
      8          48 LOAD_NAME                7 (len)
                 50 LOAD_NAME                2 (flag)
                 52 CALL_FUNCTION            1
                 54 LOAD_NAME                7 (len)
                 56 LOAD_NAME                1 (inputs)
                 58 CALL_FUNCTION            1
                 60 COMPARE_OP               3 (!=)
                 62 POP_JUMP_IF_FALSE       72
    
      9          64 LOAD_NAME                6 (print)
                 66 LOAD_CONST               6 ('Error!')
                 68 CALL_FUNCTION            1
                 70 POP_TOP
    
     10     >>   72 SETUP_LOOP              62 (to 136)
                 74 LOAD_NAME                8 (range)
                 76 LOAD_CONST               5 (0)
                 78 LOAD_NAME                7 (len)
                 80 LOAD_NAME                2 (flag)
                 82 CALL_FUNCTION            1
                 84 LOAD_CONST               7 (14)
                 86 BINARY_SUBTRACT
                 88 CALL_FUNCTION            2
                 90 GET_ITER
            >>   92 FOR_ITER                40 (to 134)
                 94 STORE_NAME               4 (i)
    
     11          96 LOAD_NAME                3 (theflag)
                 98 LOAD_NAME                9 (chr)
                100 LOAD_NAME               10 (ord)
                102 LOAD_NAME                2 (flag)
                104 LOAD_NAME                4 (i)
                106 BINARY_SUBSCR
                108 CALL_FUNCTION            1
                110 LOAD_NAME               10 (ord)
                112 LOAD_NAME                1 (inputs)
                114 LOAD_NAME                4 (i)
                116 LOAD_CONST               8 (8)
                118 BINARY_ADD
                120 BINARY_SUBSCR
                122 CALL_FUNCTION            1
                124 BINARY_ADD
                126 CALL_FUNCTION            1
                128 INPLACE_ADD
                130 STORE_NAME               3 (theflag)
                132 JUMP_ABSOLUTE           92
            >>  134 POP_BLOCK
    
     12     >>  136 SETUP_LOOP              70 (to 208)
                138 LOAD_NAME                8 (range)
                140 LOAD_CONST               9 (10)
                142 LOAD_NAME                7 (len)
                144 LOAD_NAME                2 (flag)
                146 CALL_FUNCTION            1
                148 LOAD_CONST              10 (6)
                150 BINARY_SUBTRACT
                152 CALL_FUNCTION            2
                154 GET_ITER
            >>  156 FOR_ITER                48 (to 206)
                158 STORE_NAME               4 (i)
    
     13         160 LOAD_NAME                3 (theflag)
                162 LOAD_NAME                9 (chr)
                164 LOAD_NAME               10 (ord)
                166 LOAD_NAME                2 (flag)
                168 LOAD_NAME                4 (i)
                170 BINARY_SUBSCR
                172 CALL_FUNCTION            1
                174 LOAD_NAME               10 (ord)
                176 LOAD_NAME                1 (inputs)
                178 LOAD_NAME                4 (i)
                180 LOAD_CONST               8 (8)
                182 BINARY_SUBTRACT
                184 BINARY_SUBSCR
                186 CALL_FUNCTION            1
                188 BINARY_ADD
                190 CALL_FUNCTION            1
                192 INPLACE_ADD
                194 STORE_NAME               3 (theflag)
    
     14         196 LOAD_NAME                4 (i)
                198 LOAD_CONST               2 (1)
                200 BINARY_ADD
                202 STORE_NAME               5 (j)
                204 JUMP_ABSOLUTE          156
            >>  206 POP_BLOCK
    
     15     >>  208 SETUP_LOOP              58 (to 268)
                210 LOAD_NAME                8 (range)
                212 LOAD_NAME                5 (j)
                214 LOAD_NAME                7 (len)
                216 LOAD_NAME                2 (flag)
                218 CALL_FUNCTION            1
                220 CALL_FUNCTION            2
                222 GET_ITER
            >>  224 FOR_ITER                40 (to 266)
                226 STORE_NAME               4 (i)
    
     16         228 LOAD_NAME                3 (theflag)
                230 LOAD_NAME                9 (chr)
                232 LOAD_NAME               10 (ord)
                234 LOAD_NAME                2 (flag)
                236 LOAD_NAME                4 (i)
                238 LOAD_CONST              11 (3)
                240 BINARY_SUBTRACT
                242 BINARY_SUBSCR
                244 CALL_FUNCTION            1
                246 LOAD_NAME               10 (ord)
                248 LOAD_NAME                1 (inputs)
                250 LOAD_NAME                4 (i)
                252 BINARY_SUBSCR
                254 CALL_FUNCTION            1
                256 BINARY_ADD
                258 CALL_FUNCTION            1
                260 INPLACE_ADD
                262 STORE_NAME               3 (theflag)
                264 JUMP_ABSOLUTE          224
            >>  266 POP_BLOCK
    
     17     >>  268 LOAD_NAME               11 (list)
                270 LOAD_NAME                3 (theflag)
                272 CALL_FUNCTION            1
                274 STORE_NAME              12 (flags)
    
     18         276 SETUP_LOOP              52 (to 330)
                278 LOAD_NAME                8 (range)
                280 LOAD_CONST               5 (0)
                282 LOAD_NAME                7 (len)
                284 LOAD_NAME               12 (flags)
                286 CALL_FUNCTION            1
                288 LOAD_CONST              12 (2)
                290 BINARY_FLOOR_DIVIDE
                292 CALL_FUNCTION            2
                294 GET_ITER
            >>  296 FOR_ITER                30 (to 328)
                298 STORE_NAME               4 (i)
    
     19         300 LOAD_NAME                9 (chr)
                302 LOAD_NAME               10 (ord)
                304 LOAD_NAME               12 (flags)
                306 LOAD_NAME                4 (i)
                308 BINARY_SUBSCR
                310 CALL_FUNCTION            1
                312 LOAD_CONST              13 (20)
                314 BINARY_ADD
                316 CALL_FUNCTION            1
                318 LOAD_NAME               12 (flags)
                320 LOAD_NAME                4 (i)
                322 STORE_SUBSCR
                324 EXTENDED_ARG             1
                326 JUMP_ABSOLUTE          296
            >>  328 POP_BLOCK
    
     22     >>  330 LOAD_NAME               12 (flags)
                332 LOAD_NAME                7 (len)
                334 LOAD_NAME               12 (flags)
                336 CALL_FUNCTION            1
                338 LOAD_CONST              12 (2)
                340 BINARY_FLOOR_DIVIDE
                342 LOAD_NAME                7 (len)
                344 LOAD_NAME               12 (flags)
                346 CALL_FUNCTION            1
                348 BUILD_SLICE              2
                350 BINARY_SUBSCR
                352 STORE_NAME              13 (flagt)
    
     23         354 LOAD_CONST               4 ('')
                356 LOAD_ATTR               14 (join)
                358 LOAD_NAME               13 (flagt)
                360 CALL_FUNCTION            1
                362 STORE_NAME               3 (theflag)
    
     24         364 SETUP_LOOP              46 (to 412)
                366 LOAD_NAME                8 (range)
                368 LOAD_CONST               5 (0)
                370 LOAD_NAME                7 (len)
                372 LOAD_NAME               12 (flags)
                374 CALL_FUNCTION            1
                376 LOAD_CONST              12 (2)
                378 BINARY_FLOOR_DIVIDE
                380 CALL_FUNCTION            2
                382 GET_ITER
            >>  384 FOR_ITER                24 (to 410)
                386 STORE_NAME              15 (k)
    
     25         388 LOAD_NAME                3 (theflag)
                390 LOAD_CONST               4 ('')
                392 LOAD_ATTR               14 (join)
                394 LOAD_NAME               12 (flags)
                396 LOAD_NAME               15 (k)
                398 BINARY_SUBSCR
                400 CALL_FUNCTION            1
                402 INPLACE_ADD
                404 STORE_NAME               3 (theflag)
                406 EXTENDED_ARG             1
                408 JUMP_ABSOLUTE          384
            >>  410 POP_BLOCK
    
     26     >>  412 LOAD_NAME                3 (theflag)
                414 LOAD_CONST              14 ('×x8bÙÍx8cÓÜî¤ú±¬¤¤úÖíÒ')
                416 COMPARE_OP               2 (==)
                418 EXTENDED_ARG             1
                420 POP_JUMP_IF_FALSE      432
    
     27         422 LOAD_NAME                6 (print)
                424 LOAD_CONST              15 ('You win!')
                426 CALL_FUNCTION            1
                428 POP_TOP
                430 JUMP_FORWARD             8 (to 440)
    
     29     >>  432 LOAD_NAME                6 (print)
                434 LOAD_CONST              16 ('Error!!!')
                436 CALL_FUNCTION            1
                438 POP_TOP
            >>  440 LOAD_CONST              17 (None)
                442 RETURN_VALUE
    ### The first character of flag is ‘d’, the second character is ‘1’, and the eighth character is ‘3’.
    ### scuctf{}
    

    这里涉及到python字节码的知识,其结构是这样的:

    源码行号 | 指令在函数中的偏移 | 指令符号 | 指令参数 | 实际参数值

    以及这种字节码是可以用以下指令获取:
    'python3 -m dis xxx.py'
    知道这两点,我们就不难还原出来pypypypypy.py

    inputs = input('please your flag:')
    inputs = inputs[7:-1]
    flag = 'th31_scuctf_eXclus1v3'#21
    theflag = ''
    i=0
    j=0
    print(flag[0])
    if len(flag)!=len(inputs):
        print('Error!')
    for i in range(0,len(flag)-14):#0,7 #7 0-6
        theflag += chr(ord(flag[i])+ord(inputs[i+8]))
    for i in range(10,len(flag)-6):#10,15 #5 7-11
        theflag += chr(ord(flag[i])+ord(inputs[i-8]))
        j=i+1
    for i in range(j,len(flag)):#15,21 #6 12-17
        theflag += chr(ord(flag[i-3])+ord(inputs[i]))
    flags = list(theflag)#18
    for i in range(0,len(flags)//2):#0,9 #9
        flags[i] = chr(ord(flags[i])+20)
    
    
    flagt = flags[len(flags)//2:len(flags)]#9,18 #9
    theflag = ''.join(flagt)#9
    for k in range(0,len(flags)//2):#0,9 #9
        theflag = theflag + ''.join(flags[k])#9+9=19
    if theflag == '×x8bÙÍx8cÓÜî¤ú±¬¤¤úÖíÒ':#18
        print('You win!')
    else:
        print('Error!!!')
    

    这一步又一个小坑,在调用join的时候,他写的是LOAD_ATTR......CALL_FUNCTION ,但是python3.7实测是LOAD_METHOD......CALL_METHOD
    得到pypypypypy.py以后,我们就可以写逆过程脚本了。pypypypypy-slove.py内容如下:

    theflag = '×x8bÙÍx8cÓÜî¤ú±¬¤¤úÖíÒ'
    flag = 'th31_scuctf_eXclus1v3'
    inputs=['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0']
    flagt = theflag[9:18]#9,18 #9
    flags = ''.join(flagt)#9
    for k in range(0,9):#0,9 #9
        flags = flags + ''.join(theflag[k])#9+9=19
    flags = list(flags)
    for i in range(0,9):#0,9 #9
        flags[i] = chr(ord(flags[i])-20)
    flags = ''.join(flags)
    theflag = list(flags)
    for i in range(15,21):#15,21 #6 15-20
        inputs[i] = chr(ord(theflag[i-3])-ord(flag[i-3]))
    for i in range(10,15):#10,15 #5 2-6
        inputs[i-8] = chr(ord(theflag[i-3])-ord(flag[i]))
    for i in range(0,7):#0,7 #7 8-14
        inputs[i+8] = chr(ord(theflag[i])-ord(flag[i]))
    inputs[0]='d'#这里三位在pypypypypy.txt里面提到了
    inputs[1]='1'
    inputs[7]='3'
    print(''.join(inputs))
    

    脚本写的很乱,但是因为时间原因就没再改了。脚本还原出来是
    d1s_r3v3r5e_1s_h4ppy1
    参考链接:https://www.cnblogs.com/fortwo/archive/2013/05/13/3076780.html

    Crypto

    自创觅马

    题目描述:自创觅马就是这么简单 flag{}
    题目下载链接:https://geekgame.scuctf.com/files/a3e8ec1f6dc5da065bab4523af60c596/encrypt.py

    相关知识:仿射变换密码解密

    下载附件,是一个很简单的加密脚本:

    def c2i(c):
        return ord(c)-ord('a')
    
    def i2c(i):
        return chr(i+ord('a'))
    
    def affine(x):
        return (5 *x +8)%26
    
    flag = input()
    assert(flag.startswith('flag'))
    result = "".join([i2c(affine(c2i(i))) for i in flag ] )
    print(result)
    encrypt = "hlimiuaxhiurxhefwxehyiatumx"
    if (encrypt == result):
        print("correct!")
    else:
        print("wrong!")
    

    这道题也是要写逆过程,其难点就在于affine函数的仿射变换:

    c = Ea,b(m)  ≡ a, + b(mod 26)#仿射加密
    m = Da,b(c) ≡ a^-1(c - b)(mod 26)#仿射解密
    

    这里我们要先求a^-1,也就是逆元:

    def get(a, b):
            k = a //b
            remainder = a % b
            x1, y1 = get(b, remainder)
            x, y =y1, x1 - k * y1
        return x, y
    a = input("a=")
    b = input("b=")
    a,b = get(a,b)
    ny = x%y
    print(ny)
    

    然后写解密脚本:

    def c2i(c):
        return ord(c)-ord('a')
    
    def i2c(i):
        return chr(i+ord('a'))
    
    def reaffine(x):
        return 21*(x-8)%26
    result = "hlimiuaxhiurxhefwxehyiatumx"
    flag = "".join([i2c(deaffine(c2i(i))) for i in result])
    print(flag)
    

    参考链接:https://blog.csdn.net/x_yhy/article/details/83756908

    MISC

    假的签到

    题目描述:来签到,建议MineCraft版本1.12.2,版本错误可能字加载不出来,不会真有人手动敲砖吧,不会吧不会吧。
    题目下载链接:https://geekgame.scuctf.com/files/aa3a88257fb57d6b99c1e20a8094ab23/signup.zip

    相关知识:minecraft1.12指令或McEdit或minecraft透视技巧或minecraft相关功能模组

    其实这题解法真的很多,范围也不大,不超过15格,没什么好说。最近比赛minecraft的题还蛮常见的。(不会真有人还没玩过minecraft吧,不会吧不会吧。)

  • 相关阅读:
    POJ 2112 二分+最大流
    POJ 3281 最大流
    枚举------暴力与优化
    动态规划入门
    简单二叉树
    花式WA
    18年第十二届东北四省赛
    18年第十三届黑龙江省赛
    ACM中的java的使用;
    CF#483(div2 C)
  • 原文地址:https://www.cnblogs.com/Coil1773647/p/12952590.html
Copyright © 2020-2023  润新知