这段时间玩了一下网络与信息安全领域专项赛和SUCTF,就稍微整合一下盲区。两场名次都是60+,虽然不像之前的签到选手了,但也离顶尖差很远很远。

[TOC]

网络信息安全专项赛

这个比赛的challenges相对来说比较简单,以下是我比较感兴趣的几题。

Py交易

参考Nu1L wp,以及

https://blog.csdn.net/q1uTruth/article/details/99634952

https://www.jianshu.com/p/10e6bc633938

一个无法反编译的pyc文件,需要硬刚字节码。咱没有NU1L的自定义IDA PRO,只能找工具减少工作量:

https://github.com/extremecoders-re/PjOrion-Deobfuscator

根据此工具可生成svg格式的CFG图。

官方WP:

通过对cpython源码的实现进行理解,对于PjOrion-Deobfuscator提取出来的CFG图,可以开始硬刚上面的逻辑了:

跟着CFG图走一遍可以知道开始是四个列表赋值:

a = [13433, 4747, 17752, 33060, 31051, 48809, 29988, 6421, 20021,
38888, 24844, 20706, 11713, 34938, 12865, 6085, 37391, 32840, 31964, 27194,
8701, 48142, 27066, 28626, 37431, 39142, 46795, 21771, 44280, 40628, 35013,
18583, 5418, 4347, 43929, 9934, 46892, 19868]
b = [13711, 7074, 79833, 42654, 23241, 41412, 61795, 6373, 19304,
1363, 1682, 66279, 76134, 60748, 10355, 63484, 30491, 34005, 51393, 38029,
7241, 4998, 18562, 16935, 66677, 51321, 13771, 49108, 52166, 8851, 16900,
31682, 16684, 12046, 16764, 64315, 76742, 14022]
c = [832832835, -924053193, -307134635, -527578092, 998625960,
-715102211, 3572182, -963194083, -475718185, -361574731, -678171563,
107566155, 608670527, 254218946, -81206308, -284228457, 373369420,
659110852, 165298084, -389004184, 893094421, -868933443, 44838205,
-98551062, -59800920, -575871298, -748337118, 696390966, 427210246,
-266607884, -555200820, -594235119, -233255094, 229291711, 711922719,
14476464, -783373820, 892608580]
e = [973988289, -867920193, -132362266, -172451190, 1471255182,
-242282199, 321870424, -897049789, -428663209, -256350703, -613466537,
321254055, 641759727, 344601346, -40281788, -217030057, 476060216,
767746297, 503093626, -102198850, 984358207, -415480559, 322813233,
178032672, 48876640, -467362638, -260077296, 923436845, 536082660,
-138702820, -210365307, -397666023, -215329942, 274852104, 818217684,
41479433, -632022956, 1204798830]

建立列表之后,比较d和e,如果相等则调用p_s函数对象,不相等则调用p_f函数对象,在我们用marshl得到的信息中可以知道p_s和p_f的逻辑,在此题中p_s和p_f只是两个打印的函数而已。

通过分析得到d和e的关系:

d.append(a[i]*data[i]*data[i] + b[i]*data[i])

可以拟以下函数,其中x中为随便赋的值,然后通过dis模块打印字节码,以便将逻辑看的更为清晰,本题要求的即为flag==>x[]

import dis;dis.dis(get):

            597 STORE_FAST               4 (x)

 25         600 BUILD_LIST               0
            603 STORE_FAST               5 (d)

 26         606 SETUP_LOOP              77 (to 686)
            609 LOAD_GLOBAL              0 (range)
            612 LOAD_CONST             191 (38)
            615 CALL_FUNCTION            1
            618 GET_ITER            
        >>  619 FOR_ITER                63 (to 685)
            622 STORE_FAST               6 (i)

 27         625 LOAD_FAST                5 (d)
            628 LOAD_ATTR                1 (append)
            631 LOAD_FAST                0 (a)
            634 LOAD_FAST                6 (i)
            637 BINARY_SUBSCR       
            638 LOAD_FAST                4 (x)
            641 LOAD_FAST                6 (i)
            644 BINARY_SUBSCR       
            645 BINARY_MULTIPLY     
            646 LOAD_FAST                4 (x)
            649 LOAD_FAST                6 (i)
            652 BINARY_SUBSCR       
            653 BINARY_MULTIPLY     
            654 LOAD_FAST                1 (b)
            657 LOAD_FAST                6 (i)
            660 BINARY_SUBSCR       
            661 LOAD_FAST                4 (x)
            664 LOAD_FAST                6 (i)
            667 BINARY_SUBSCR       
            668 BINARY_MULTIPLY     
            669 BINARY_ADD          
            670 LOAD_FAST                2 (c)
            673 LOAD_FAST                6 (i)
            676 BINARY_SUBSCR       
            677 BINARY_ADD          
            678 CALL_FUNCTION            1
            681 POP_TOP             
            682 JUMP_ABSOLUTE          619
        >>  685 POP_BLOCK           

可以看到与CFG图中的逻辑基本一致,只是少了很多不必要的跳转,此题基本到此结束。

SUCTF

guess_game

此题是一个pickle反序列化的题目,虽然有思路,但是苦于不知道如何手工构造payload。

看wp后:

https://github.com/rmb122/suctf2019_guess_game/tree/master/writeup

https://www.leavesongs.com/PENETRATION/code-breaking-2018-python-sandbox.html

从底层去理解一门语言真的tql,orz…😄