看雪·眾安 2021 KCTF 秋季賽 | 第九題設計思路及解析
看雪·眾安 2021 KCTF秋季賽的第九題《萬事俱備》已於今天中午12點截止答題!
本題共有5支戰隊成功破解,分別是辣雞戰隊、中婭之戒、金左手、mininep、INVCODE。
恭喜辣雞戰隊用時83346秒拿下“一血”,接下來和我一起來看看該賽題的設計思路和相關解析吧~
出題團隊簡介
第九題《萬事俱備》出題方:【Archaia】戰隊。
【Archaia】戰隊成員如下:
賽題詳情
題目名稱:Pythonscation(混淆叫obfuscation, 此題是基於python的混淆)
附件檔案:
CrackMe.zip:比賽期間公開給攻擊方的題目,包含題目可執行檔案和公開的一組序列號
source.py:演算法原始碼,包含序號產生器部分程式碼
公開的使用者名稱及序列號:
使用者名稱 : 05C1930A146B0FC3
序列號 : 8E6E67F357338CC7912F3161CBAC4273
題目答案:
使用者名稱 : KCTF
序列號 : AD0A1F8179ABE48ED3B073F840DA52A7
賽題設計思路
本題目驗證演算法使用python2.7編寫, 編譯的pyc檔案和python27.exe打包成一個自解壓檔案exe。
自解壓檔案exe使用易語言編寫, 完成了寫出檔案到臨時目錄/帶命令列呼叫python/刪除臨時檔案的操作。執行的命令列:python27.exe check.py。
自解壓的壓縮包內容:
本題目設計重點在python的pyc檔案二進位制混淆:
對pyc的字串/變數名/控制流進行了二進位制的混淆 自己編譯python可執行檔案, 修改了原版的opcode
這倆混淆操作, 使得全部公開的python反編譯工具無法使用, 需要攻擊方閱讀python原始碼, 根據python位元組碼恢復程式混淆。
看懂了此題的設計, 此題兩種做法就比較清晰了:
大佬直接硬擼python opcode寫你演算法, 就像看好幾M的x86程式碼混淆一樣 網上找一份開源的python反編譯工具(也可以自己寫), 修改程式碼適配好此題的混淆和opcode
本題目演算法部分使用了上屆KCTF題目中的老演算法+RC4, RC4跑兩輪,在標準RC4演算法上每輪運算多加了個異或常量,演算法部分難度不高是為突出題目重心--pyc二進位制混淆。只要攻擊方能擊破程式碼混淆, 就是看“原始碼”寫逆演算法的活了。
賽題解析
本賽題解析由看雪論壇ccfer給出:
執行CrackMe.exe,發現會在臨時目錄建立python27程式,把臨時目錄打包拷貝出來,直接研究check.py。
發現check.py是編譯過的,且不是標準opcode。
IDA開啟python27.dll找到PyEval_EvalFrameEx,找到到這裡:
.text:000000001E1678D0 cmp esi, 93h ; switch 148 cases.text:000000001E1678D6 ja def_1E1678EA ; jumptable 000000001E1678EA default case, cases 12,21,27,34-36,38,43,44,47,49,55,58,61,68,75,78-80,82,84,91,96,97,103,104,117,121,129,144.text:000000001E1678DC movsxd rax, esi.text:000000001E1678DF mov ecx, ds:(jpt_1E1678EA - 1E000000h)[r11+rax*4].text:000000001E1678E7 add rcx, r11.text:000000001E1678EA jmp rcx ; switch jump
對應原始碼ceval.c的PyEval_EvalFrameEx中的:switch (opcode) {}
把opcode定義整理出來,更新到opcode.h檔案中,把每條opcode寫log輸出記錄,注意做下模組過濾,減少無用輸出。
然後編譯得到帶log輸出的python27環境,執行自己的python27:python27 check.py。
得到全部log有900多M,搜尋到"input username",把前面的全刪掉,還剩200多M。
然後發現很多類似這樣的組合序列:
off=0021, [op=6D LOAD_FAST]:push 65826766491753696159103395487087Loff=0024, [op=83 LOAD_CONST]:push 86714445000368537639824468062475Loff=0027, [op=5F COMPARE_OP]:off=002D, [op=76 JUMP_ABSOLUTE]
感覺像是加的混淆,寫個指令碼清理掉,可以大膽清理,主要保留邏輯和數學運算即可,最後還剩下2M多,1萬多行了。
比如我輸入的名字是:KCTF,序列號是:00000000000000000000000000000000,觀察前面一段log:
off=1032, [op=77 STORE_FAST]:pop 'KCTF'off=0C46, [op=83 LOAD_CONST]:push 10off=10D6, [op=5A CALL_FUNCTION]:off=0C59, [op=77 STORE_FAST]:pop '00000000000000000000000000000000'off=093F, [op=83 LOAD_CONST]:push 220off=0C8D, [op=6D LOAD_FAST]:push 'KCTF'off=0EC9, [op=5F COMPARE_OP]:off=0F10, [op=6D LOAD_FAST]:push '00000000000000000000000000000000'off=090C, [op=83 LOAD_CONST]:push 446off=116D, [op=5A CALL_FUNCTION]:off=0D99, [op=5A CALL_FUNCTION]:off=0C04, [op=6D LOAD_FAST]:push '00000000000000000000000000000000'off=0CC1, [op=5F COMPARE_OP]:off=091F, [op=6D LOAD_FAST]:push 'KCTF'off=0D87, [op=5A CALL_FUNCTION]:off=0E93, [op=83 LOAD_CONST]:push 16off=0983, [op=5F COMPARE_OP]:off=0F73, [op=83 LOAD_CONST]:push 26off=117E, [op=77 STORE_FAST]:pop 'kctf2021GoodLuck'off=0EDA, [op=6D LOAD_FAST]:push 'KCTF'off=0CF9, [op=5A CALL_FUNCTION]:off=0996, [op=83 LOAD_CONST]:push 16off=0E17, [op=5F COMPARE_OP]:off=0BD0, [op=6D LOAD_FAST]:push 'KCTF'off=0A36, [op=83 LOAD_CONST]:push 178off=0D1C, [op=6D LOAD_FAST]:push 'kctf2021GoodLuck'off=0FB7, [op=6D LOAD_FAST]:push 'KCTF'off=09BA, [op=5A CALL_FUNCTION]:off=0AEF, [op=83 LOAD_CONST]:push 1off=0D75, [op=51 BINARY_ADD]:1 + 4 = 5off=1192, [op=77 STORE_FAST]:pop 'KCTF@021GoodLuck'off=0D53, [op=77 STORE_FAST]:pop []off=10B5, [op=6D LOAD_FAST]:push []off=0A24, [op=6D LOAD_FAST]:push 'helloctf_pediy_Archaia'off=08D3, [op=5A CALL_FUNCTION]:off=09A6, [op=83 LOAD_CONST]:push 0off=0930, [op=77 STORE_FAST]:pop 0off=082F, [op=83 LOAD_CONST]:push 507off=0BDE, [op=5A CALL_FUNCTION]:off=06A5, [op=6D LOAD_FAST]:push 'helloctf_pediy_Archaia'off=0B3C, [op=5A CALL_FUNCTION]:off=09E2, [op=5A CALL_FUNCTION]:off=0BF2, [op=77 STORE_FAST]:pop 'bfdc823fca7d85034d70f650df268108
能看出是把名字KTCF替換掉kctf2021GoodLuck的前幾個字元得到KCTF@021GoodLuck;
從helloctf_pediy_Archaia到bfdc823fca7d85034d70f650df268108,用hash計算器對比一下是md5;
直接看序列號後續怎麼處理的吧,一搜就跳到了9000多行的地方,後面只剩2000多行了,估計可以看下去了:
off=1057, [op=6D LOAD_FAST]:push '00000000000000000000000000000000'off=0CD5, [op=5A CALL_FUNCTION]:off=13C2, [op=83 LOAD_CONST]:push 0off=123A, [op=77 STORE_FAST]:pop 0off=0CBC, [op=77 STORE_FAST]:pop 0off=11CC, [op=6D LOAD_FAST]:push '00000000000000000000000000000000'off=0EBD, [op=83 LOAD_CONST]:push 421off=0F11, [op=5A CALL_FUNCTION]:off=0C26, [op=83 LOAD_CONST]:push 694off=0C5E, [op=5A CALL_FUNCTION]:off=0F9B, [op=77 STORE_FAST]:pop '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'off=0C05, [op=83 LOAD_CONST]:push ''off=0FF6, [op=77 STORE_FAST]:pop ''off=0EF0, [op=83 LOAD_CONST]:push ''off=0BDF, [op=77 STORE_FAST]:pop ''off=0B89, [op=6D LOAD_FAST]:push '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'off=0FAF, [op=77 STORE_FAST]:pop '\x00'off=0ED0, [op=6D LOAD_FAST]:push 0off=102A, [op=83 LOAD_CONST]:push 1off=1316, [op=51 BINARY_ADD]:1 + 0 = 1off=144F, [op=83 LOAD_CONST]:push 256off=0C81, [op=0E BINARY_MODULO]:1 % 256 = 1off=0B1C, [op=77 STORE_FAST]:pop 1off=12DB, [op=6D LOAD_FAST]:push 0off=15FA, [op=6D LOAD_FAST]:push [98, 30, 106, 149, 9, 136, 33, 174, 26, 128, 32, 48, 116, 69, 244, 5, 122, 239, 79, 147, 197, 64, 16, 10, 53, 188, 135, 89, 120, 12, 73, 160, 34, 169, 96, 179, 54, 29, 191, 76, 215, 180, 70, 84, 181, 15, 211, 157, 59, 75, 218, 133, 132, 161, 242, 237, 99, 18, 199, 162, 83, 183, 102, 156, 137, 163, 61, 190, 110, 227, 3, 94, 142, 201, 158, 27, 184, 178, 39, 77, 74, 62, 115, 22, 126, 95, 234, 186, 38, 243, 103, 203, 107, 101, 219, 36, 41, 4, 196, 140, 165, 200, 93, 145, 45, 195, 141, 185, 249, 155, 8, 117, 113, 65, 224, 63, 170, 233, 60, 23, 131, 111, 35, 52, 80, 166, 212, 146, 204, 228, 100, 2, 238, 235, 88, 189, 58, 17, 114, 44, 47, 214, 171, 6, 209, 207, 121, 21, 182, 194, 91, 150, 192, 25, 139, 252, 7, 173, 86, 28, 104, 11, 223, 127, 125, 14, 251, 124, 40, 87, 231, 246, 50, 82, 20, 221, 130, 241, 172, 42, 97, 129, 205, 220, 144, 225, 49, 138, 57, 222, 250, 193, 206, 43, 13, 217, 164, 245, 148, 1, 202, 90, 109, 248, 253, 92, 187, 226, 19, 46, 67, 31, 105, 143, 153, 78, 123, 236, 56, 208, 66, 176, 118, 51, 175, 85, 255, 177, 254, 112, 213, 37, 210, 167, 72, 24, 232, 0, 168, 216, 230, 198, 134, 154, 240, 229, 152, 159, 151, 55, 81, 119, 108, 71, 247, 68]off=0B41, [op=6D LOAD_FAST]:push 1off=12F6, [op=51 BINARY_ADD]:30 + 0 = 30off=0DC2, [op=83 LOAD_CONST]:push 256off=15C6, [op=0E BINARY_MODULO]:30 % 256 = 30off=1093, [op=77 STORE_FAST]:pop 30off=0CE1, [op=6D LOAD_FAST]:push [98, 30, 106, 149, ...]off=0F77, [op=6D LOAD_FAST]:push 30off=12C9, [op=6D LOAD_FAST]:push [98, 30, 106, 149, ...]off=0CA8, [op=6D LOAD_FAST]:push 1off=1583, [op=6D LOAD_FAST]:push [98, 30, 106, 149, ...]off=0F23, [op=6D LOAD_FAST]:push 1off=0FE4, [op=6D LOAD_FAST]:push [98, 73, 106, 149, ...]off=0E85, [op=6D LOAD_FAST]:push 30off=141B, [op=6D LOAD_FAST]:push [98, 73, 106, 149, ...]off=0F66, [op=6D LOAD_FAST]:push 1off=0C4B, [op=6D LOAD_FAST]:push [98, 73, 106, 149, ...]off=15D8, [op=6D LOAD_FAST]:push 30off=0F55, [op=51 BINARY_ADD]:30 + 73 = 103off=124C, [op=83 LOAD_CONST]:push 256off=155D, [op=0E BINARY_MODULO]:103 % 256 = 103off=0D37, [op=77 STORE_FAST]:pop 103off=10C7, [op=6D LOAD_FAST]:push '\x00'off=10E9, [op=5A CALL_FUNCTION]:off=12B6, [op=6D LOAD_FAST]:push [98, 73, 106, 149, ...]off=1507, [op=6D LOAD_FAST]:push [98, 73, 106, 149, ...]off=0CD0, [op=6D LOAD_FAST]:push 1off=0E73, [op=6D LOAD_FAST]:push [98, 73, 106, 149, ...]off=153A, [op=6D LOAD_FAST]:push 30off=1173, [op=51 BINARY_ADD]:30 + 73 = 103off=137B, [op=83 LOAD_CONST]:push 256off=1182, [op=0E BINARY_MODULO]:103 % 256 = 103off=1005, [op=58 BINARY_XOR]:145 ^ 0 = 145
上面這一段是將輸入位元組化,結合一個256位元組的表,以及後面的加法和異或,就可以聯想的rc4了。
這就不用細看了,直接往後翻到最後一次試用256位元組金鑰表的地方,又跳過了1500行左右,後面只剩幾百行了:
off=0D16, [op=6D LOAD_FAST]:push 32off=113E, [op=6D LOAD_FAST]:push [98, 73, 58, 12, 191, 20, 226, 166, 150, 10, 237, 145, 208, 160, 197, 188, 21, 100, 46, 165, 38, 192, 40, 215, 101, 196, 167, 61, 49, 77, 155, 34, 115, 169, 96, 179, 54, 29, 9, 76, 128, 180, 70, 84, 181, 15, 211, 157, 59, 75, 218, 133, 132, 161, 242, 32, 99, 18, 199, 162, 83, 183, 102, 156, 137, 163, 89, 190, 110, 227, 3, 94, 142, 201, 158, 27, 184, 178, 39, 149, 74, 62, 69, 22, 126, 95, 234, 186, 244, 243, 103, 203, 107, 53, 219, 36, 41, 4, 5, 140, 147, 200, 93, 48, 45, 195, 141, 185, 249, 30, 8, 117, 113, 65, 224, 63, 170, 233, 60, 23, 131, 111, 35, 52, 80, 174, 212, 146, 204, 228, 239, 2, 238, 235, 88, 189, 106, 17, 114, 44, 47, 214, 171, 6, 209, 207, 121, 122, 182, 194, 91, 26, 64, 25, 139, 252, 7, 173, 86, 28, 104, 11, 223, 127, 125, 14, 251, 124, 16, 87, 231, 246, 50, 82, 136, 221, 130, 241, 172, 42, 97, 129, 205, 220, 144, 225, 120, 138, 57, 222, 250, 193, 206, 43, 13, 217, 164, 245, 148, 1, 202, 90, 109, 248, 253, 92, 187, 33, 19, 79, 67, 31, 105, 143, 153, 78, 123, 236, 56, 116, 66, 176, 118, 51, 175, 85, 255, 177, 254, 112, 213, 37, 210, 135, 72, 24, 232, 0, 168, 216, 230, 198, 134, 154, 240, 229, 152, 159, 151, 55, 81, 119, 108, 71, 247, 68]off=0DEA, [op=6D LOAD_FAST]:push 82off=0E10, [op=51 BINARY_ADD]:69 + 115 = 184off=0DB1, [op=83 LOAD_CONST]:push 256off=15E8, [op=0E BINARY_MODULO]:184 % 256 = 184off=1592, [op=58 BINARY_XOR]:144 ^ 167 = 55off=10D8, [op=83 LOAD_CONST]:push 61off=154C, [op=58 BINARY_XOR]:61 ^ 55 = 10off=138C, [op=5A CALL_FUNCTION]:off=0DD6, [op=77 STORE_FAST]:pop '\n'off=1227, [op=6D LOAD_FAST]:push '\x1bO\xf4\xd1\xf9\xf3X\x95\xb4\n\xec\xa5S\x9c\xba'
看到這個:'\x1bO\xf4\xd1\xf9\xf3X\x95\xb4\n\xec\xa5S\x9c\xba'
應該是rc4的最終結果了,為了證實,這次用1B4FF4D1F9F35895B40AECA5539CBA0A作為序列號輸入重新log一遍
再觀察這裡確實得到'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00';
所以這一段rc4只要用{0x1B,0x4F,0xF4,0xD1,0xF9,0xF3,0x58,0x95,0xB4,0x0A,0xEC,0xA5,0x53,0x9C,0xBA,0x0A}做一次異或即可求解。
最後幾百行慢慢整理:
off=1F98, [op=45 BINARY_MULTIPLY]:0 * 2 = 0off=22F2, [op=51 BINARY_ADD]:0 + 14 = 14off=19AD, [op=58 BINARY_XOR]:14 ^ 5 = 11off=2F94, [op=83 LOAD_CONST]:push 16off=2504, [op=0E BINARY_MODULO]:11 % 16 = 11off=2159, [op=5A CALL_FUNCTION]:off=2C18, [op=83 LOAD_CONST]:push 8off=25E8, [op=42 BINARY_LSHIFT]:8 << 165 = 42240off=1D21, [op=6D LOAD_FAST]:push '\x1bO\xf4\xd1\xf9\xf3X\x95\xb4\n\xec\xa5S\x9c\xba\n'off=2D5C, [op=6D LOAD_FAST]:push 5off=2FCB, [op=6D LOAD_FAST]:push 14off=2C4B, [op=83 LOAD_CONST]:push 2off=2262, [op=6D LOAD_FAST]:push 0off=1C92, [op=45 BINARY_MULTIPLY]:0 * 2 = 0off=256D, [op=51 BINARY_ADD]:0 + 14 = 14off=2103, [op=83 LOAD_CONST]:push 1off=2B25, [op=51 BINARY_ADD]:1 + 14 = 15off=2000, [op=58 BINARY_XOR]:15 ^ 5 = 10off=1FBD, [op=83 LOAD_CONST]:push 16off=2464, [op=0E BINARY_MODULO]:10 % 16 = 10off=1F11, [op=5A CALL_FUNCTION]:off=2499, [op=51 BINARY_ADD]:236 + 42240 = 42476off=26EA, [op=77 STORE_FAST]:pop 42476off=1FCE, [op=6D LOAD_FAST]:push []off=24F4, [op=6D LOAD_FAST]:push 42476off=28E7, [op=11 INPLACE_ADD]:[42476] + [42476] = [42476]...中間省略600多行off=2817, [op=6D LOAD_FAST]:push '\x05\x88\x10\xde\xc1\xa1\xb2B\xbc\x0b\x1b\xd6['off=2208, [op=6D LOAD_FAST]:push [34821, 56848, 41409, 17074, 3004, 54811, 30811, 30763]off=2CCD, [op=6D LOAD_FAST]:push 6off=304F, [op=83 LOAD_CONST]:push 8off=1DE3, [op=13 BINARY_RSHIFT]:8 >> 30811 = 120off=2FB9, [op=5A CALL_FUNCTION]:off=2C2A, [op=77 STORE_FAST]:pop '\x05\x88\x10\xde\xc1\xa1\xb2B\xbc\x0b\x1b\xd6[x'off=2E59, [op=77 STORE_FAST]:pop 7off=1FA9, [op=6D LOAD_FAST]:push '\x05\x88\x10\xde\xc1\xa1\xb2B\xbc\x0b\x1b\xd6[x'off=2DB8, [op=6D LOAD_FAST]:push [34821, 56848, 41409, 17074, 3004, 54811, 30811, 30763]off=25A0, [op=6D LOAD_FAST]:push 7off=24E1, [op=83 LOAD_CONST]:push 255off=20CF, [op=12 BINARY_AND]:255 & 30763 = 43off=190D, [op=5A CALL_FUNCTION]:off=2AC6, [op=77 STORE_FAST]:pop '\x05\x88\x10\xde\xc1\xa1\xb2B\xbc\x0b\x1b\xd6[x+'off=2817, [op=6D LOAD_FAST]:push '\x05\x88\x10\xde\xc1\xa1\xb2B\xbc\x0b\x1b\xd6[x+'off=2208, [op=6D LOAD_FAST]:push [34821, 56848, 41409, 17074, 3004, 54811, 30811, 30763]off=2CCD, [op=6D LOAD_FAST]:push 7off=304F, [op=83 LOAD_CONST]:push 8off=1DE3, [op=13 BINARY_RSHIFT]:8 >> 30763 = 120off=2FB9, [op=5A CALL_FUNCTION]:off=2C2A, [op=77 STORE_FAST]:pop '\x05\x88\x10\xde\xc1\xa1\xb2B\xbc\x0b\x1b\xd6[x+x'off=1AEF, [op=6D LOAD_FAST]:push '\x05\x88\x10\xde\xc1\xa1\xb2B\xbc\x0b\x1b\xd6[x+x'off=0970, [op=77 STORE_FAST]:pop '\x05\x88\x10\xde\xc1\xa1\xb2B\xbc\x0b\x1b\xd6[x+x'off=0FF9, [op=6D LOAD_FAST]:push '\x05\x88\x10\xde\xc1\xa1\xb2B\xbc\x0b\x1b\xd6[x+x'off=0A10, [op=6D LOAD_FAST]:push 'KCTF@021GoodLuck'
上面一段WORD操作的演算法整出來這樣的:
void decode(WORD *t,WORD *o){ WORD u,v,w,y; WORD k,e; WORD n,h; u = t[5] ^ t[2]; v = t[3] + t[0]; y = t[1] - t[6]; w = u & v; h = ((~u & y) | w); k = get_bits1(t[7] ^ t[4]); o[7] = rotl16(h ^ t[4], k); o[6] = rotl16(h ^ t[7], k); n = (h * u >> k) + 0x18; o[5] = t[6] + n; o[4] = t[1] + n; o[3] = t[0] - (y ^ n); o[2] = t[3] + (y ^ n); e = (h | n) & (y ^ n) | (h & n); o[1] = e ^ t[2]; o[0] = e ^ t[5];}
8個WORD拼起來等於'KCTF@021GoodLuck'就OK了,keygen:
void encode(WORD *t,WORD *o){ DWORD i; WORD u,v,w,y,k,e,n,h; y = t[4] - t[5]; v = t[2] + t[3]; u = t[0] ^ t[1]; w = u & v; h = ((~u & y) | w); k = get_bits1(t[6] ^ t[7]); n = (h * u >> k) + 0x18; e = (h | n) & (y ^ n) | (h & n); o[4] = rotl16(t[7], 16 - k) ^ h; o[7] = rotl16(t[6], 16 - k) ^ h; o[6] = t[5] - n; o[1] = t[4] - n; o[0] = t[3] + (y ^ n); o[3] = t[2] - (y ^ n); o[2] = e ^ t[1]; o[5] = e ^ t[0];} void kg(){ BYTE sn[16] = {0x1B,0x4F,0xF4,0xD1,0xF9,0xF3,0x58,0x95,0xB4,0x0A,0xEC,0xA5,0x53,0x9C,0xBA,0x0A}; BYTE x[16] = {0}; WORD y[8] = {0}; int i; memcpy(y, "KCTF@021GoodLuck", 16); encode(y, (WORD *)x); for (i=0;i<16;i++) { sn[i] ^= x[i]; }}
編譯執行得到:AD0A1F8179ABE48ED3B073F840DA52A7。
往期解析
1、看雪·眾安 2021 KCTF 秋季賽 | 第二題設計思路及解析
2、看雪·眾安 2021 KCTF 秋季賽 | 第三題設計思路及解析
3、看雪·眾安 2021 KCTF 秋季賽 | 第四題設計思路及解析
4、看雪·眾安 2021 KCTF 秋季賽 | 第五題設計思路及解析
5、看雪·眾安 2021 KCTF 秋季賽 | 第六題設計思路及解析
6、看雪·眾安 2021 KCTF 秋季賽 | 第七題設計思路及解析
7、看雪·眾安 2021 KCTF 秋季賽 | 第八題設計思路及解析
第十題《生命的饋贈》正在火熱進行中,
還在等什麼,快來參賽吧!
【注意】:設計團隊為第十題精心製作了微電影—《生命的饋贈》。參賽者可在影片中尋找解題思路哦,提前尋寶的同時還可參與活動贏獎品!
活動詳情
觀看完視訊後,在論壇貼(https://bbs.pediy.com/thread-270683.htm)下方【打卡】並留言
【說說你從短片中獲得了什麼?如影片立意、觀後感等】,揪3位幸運朋友送上精美獎品一份!
注意:
1、比賽期間不可討論本題相關的解題細節,該題結束後方可討論;
2、需要參與上述活動才可贏取獎品,不單單隻回覆【打卡】,我們會挑選質量高的留言送上獎品!!!
活動時間
12月08日-12月13日(週一)中午11:00
獎品一:《白帽子講Web安全》紀念版
數量:1本
獎品二:藍芽音響
數量:2
- End -
公眾號ID:ikanxue
官方微博:看雪安全
商務合作:wsc@kanxue.co
相關文章
- 看雪·眾安 2021 KCTF 秋季賽 | 第十題設計思路及解析2021-12-16
- 看雪·眾安 2021 KCTF 秋季賽 | 第七題設計思路及解析2021-12-03
- 看雪·眾安 2021 KCTF 秋季賽 | 第六題設計思路及解析2021-12-01
- 看雪·眾安 2021 KCTF 秋季賽 | 第五題設計思路及解析2021-11-29
- 看雪·眾安 2021 KCTF 秋季賽 | 第四題設計思路及解析2021-11-25
- 看雪·眾安 2021 KCTF 秋季賽 | 第三題設計思路及解析2021-11-22
- 看雪·眾安 2021 KCTF 秋季賽 | 第十一題設計思路及解析2021-12-15
- 看雪·深信服 2021 KCTF 春季賽 | 第九題設計思路及解析2021-05-28
- 看雪·深信服 2021 KCTF 春季賽 | 第十題設計思路及解析2021-05-31
- 看雪·深信服 2021 KCTF 春季賽 | 第七題設計思路及解析2021-05-25
- 看雪·深信服 2021 KCTF 春季賽 | 第八題設計思路及解析2021-05-25
- 看雪·深信服 2021 KCTF 春季賽 | 第六題設計思路及解析2021-05-21
- 看雪·深信服 2021 KCTF 春季賽 | 第三題設計思路及解析2021-05-14
- 看雪·深信服 2021 KCTF 春季賽 | 第四題設計思路及解析2021-05-17
- 看雪·深信服 2021 KCTF 春季賽 | 第五題設計思路及解析2021-05-17
- 看雪·深信服 2021 KCTF 春季賽 | 第二題設計思路及解析2021-05-12
- 2020 KCTF秋季賽 | 第五題設計及解題思路2020-11-30
- 2020 KCTF秋季賽 | 第二題設計及解題思路2020-11-23
- 戰局已定!排行榜新鮮出爐!看雪·眾安 2021 KCTF秋季賽圓滿收官!2021-12-17
- 看雪.紐盾 KCTF 2019 Q3 | 第九題點評及解題思路2019-10-08
- 看雪.紐盾 KCTF 2019 Q2 | 第九題點評及解題思路2019-07-04
- 今天中午12點,看雪·眾安 2021 KCTF秋季賽挑戰開啟,書寫你的傳奇故事!2021-11-15
- 2020 KCTF秋季賽 | 第一題點評及解題思路2020-11-20
- 2020 KCTF秋季賽 | 第四題點評及解題思路2020-11-24
- 2021看雪KCTF逆向WP2021-05-21
- 看雪CTF.TSRC 2018 團隊賽 第九題『諜戰』 解題思路2018-12-19
- 看雪.紐盾 KCTF 2019 Q3 | 第四題點評及解題思路2019-09-29
- 看雪.紐盾 KCTF 2019 Q3 | 第七題點評及解題思路2019-09-30
- 看雪.紐盾 KCTF 2019 Q3 | 第一題點評及解題思路2019-09-25
- 看雪.紐盾 KCTF 2019 Q3 | 第六題點評及解題思路2019-10-08
- 看雪.紐盾 KCTF 2019 Q3 | 第八題點評及解題思路2019-10-08
- 看雪.紐盾 KCTF 2019 Q3 | 第十題點評及解題思路2019-10-08
- 看雪.紐盾 KCTF 2019 Q2 | 第七題點評及解題思路2019-07-02
- 看雪.紐盾 KCTF 2019 Q2 | 第六題點評及解題思路2019-07-01
- 看雪.紐盾 KCTF 2019 Q2 | 第十題點評及解題思路2019-07-05
- 看雪.紐盾 KCTF 2019 Q2 | 第八題點評及解題思路2019-07-03
- 看雪.紐盾 KCTF 2019 Q2 | 第一題點評及解題思路2019-07-01
- 看雪.紐盾 KCTF 2019 Q2 | 第二題點評及解題思路2019-07-01