DEFCON 26 CTF参赛记

今年作为Tea Deliverers一员参加DEFCON 26 CTF。Redbud、Nu1L、ROIS、长亭科技几个员工组成Tea Deliverers,在DEFCON 26 CTF Quals中晋级Finals。DEFCON 21~25 CTF的主办方Legitimate Business Syndicate退休之后原来Shellphish的一些人组成oooverflow接手了。我们推测赛制可能会发生较大变化(往年使用一种零和赛制,被很多比赛的决赛沿用)。

参加决赛的队伍从15支增加到了24支:

1 0daysober
2 A*0*E
3 BFS
4 binja
5 C.G.K.S
6 DEFKOR00T
7 Dragon Sector
8 HITCON
9 hxp
10 KaisHack+PLUS+GoN
11 koreanbadass
12 mhackeroni
13 pasten
14 PPP
15 PwnThyBytes
16 r3kapig
17 RPISEC
18 Samurai
19 Sauercloud
20 Shellphish
21 Spaceballs
22 Tea Deliverers
23 TeamBaguette
24 TokyoWesterns

其中,A*0*E(浙江大学AAA+上海交大0ops+腾讯eee+复旦大学六星)、r3kapig(Eur3kA+FlappyPig)、Tea Deliverers是来自中国大陆的队伍。BFS(交通大学BambooFox、台湾大学Balsn、中央大学DoubleSigma以及中科院Kerkeryuan CTF)、HITCON是来自台湾的队伍。

赛前我又学习了一些radare2,在缺乏实践的情况下发了一些简单的pull requests,改进tab补全、提高switch case的可读性、修复一些bug、改进meson build system等。

We will run one power cable and one ethernet cable for each team. You will access the game over the ethernet cable using ipv4. We plan to provide internet access over this same link, however, this depends somewhat on the hotel's cooperation, so please be prepared for the contingency where we don't have internet, have filtered internet, or the world suddenly switches to FreeBSD and ipv6.

蛮期待有FreeBSD的,因为我在llvm里有一些(微小的)FreeBSD commits,可惜我们都知道FreeBSD ASLR道阻且长。

8月8日

北京时间8月8日从北京出发的riatre和marche147在Pacific Daylight Time中午到达,随后从SJC出发的我也到达了,因为手机AT&T信号不好没有注意和他们先汇合,独自打车去Caesars Palace,造成多余开销。到达后check in Palace Tower的两间房,在楼下去年吃过几次的北京九号吃推迟的午饭。

Tea Deliverers大部队乘坐Korean Air航班,在首尔转机时前一班延误导致赶不上去Las Vegas的,在首尔多待了一天。他们带着比赛需要的NUC和路由器。因此我们三个人没有办法提前做些准备(riatre称之为“修电脑”)。cxm和ckx也到达了,出去采购。

r3kapig一些队员也在今天到达了。晚上riatre、marche147和我找他们四个队员(Atum、两位天津大学学生、一个参加过ISC'16的USTC学生)吃饭,路上遇到了slipper和Tiffany Bao,原来他们也是主办方oooverflow成员。slipper从对手、联合战队队友、顾问(DEFCON 25 CTF)到主办方😮。

8月9日

cxm 9:00领取给比赛选手提供的8个badges(进入会场的凭证),因此同时在赛场的选手只能有8个(其实很多选手更愿意待在酒店,因为现场嘈杂)。今年段海新老师和刘保君给我们提供后勤支持(采购水、食物、订午餐晚餐)。下午采购东西。

从北京出发的大部队晚上到达,在Caesars Palace开了一间Forum Classic Suite。有一间Palace Tower房间因为延迟一天check in被取消了,好在后来升舱了。

下午cxm和ckx去Blackhat会场买T恤衫。riatre和我拿着badge去会场看看。但根据往年经验,DEFCON第一天并没有多少活动,主要活动时间和CTF重叠。

晚上段海新老师请我们在Paris Las Vegas的Le Village Buffet吃饭。作为常年参加DEFCON CTF Finals的选手发现今年熟悉的kelwin、libmaru、eadom不见了,似乎都是新鲜的面孔:ccls用户iromise(参加过ASC'16,现任清华大学学生网络安全技术协会会长)、去年还能回答知乎问题“高中生进入各大CTF的Final是怎样的一种体验?”的Misty、清华大学地球系统科学系的wirefish、网络研究院的ckx、三个经常更换id的web手(chromium1337、kericwy、wupco),友情支援我们的在UC Riverside交换的吴炜。

回去后大家在套房集合,BrieflyX编排了比赛现场和套房采用的网络环境:现场使用NUC,套房放置极路由(OpenWRT,我们对e1000e驱动传输大文件容易出问题的状况已经有心无力,使用了一个USB to Ethernet adapter),两者连接一个美国VPS部署的OpenVPN server。次日获得比赛现场使用的内网地址后,需要修改OpenVPN server设置push route和iroute推送路由(后来据说r3kapig的iroute配置错误导致网络瘫痪了一段时间)。现场和套房选手连接NUC或路由器后能透明访问比赛内网。

kelwin转发我们邮件,因为次日DEFCON 9:00会有很多人排队,goon设置了一个快速通道供CTF参赛选手进入Augustus Room(比赛现场)。

8月10日Day 1

主办方因为网络配置原因延迟了1个小时开赛。投影的大屏幕上有比赛规则链接http://oooverflow.io/obey。除了DEFCON CTF决赛传统的Attack and Defense类型题目外还设有King of the Hill (KoH)类型题目。

  • Attack and Defense:故意隐藏漏洞的服务,队伍需要找出漏洞、修补服务(抵挡其他队伍攻击则获得防御分)、攻击其他队伍的服务获得flag、提交flag得分(攻击分)
  • King of the Hill:根据解的质量得分。第一名每回合获得10分,第二到五名分别获得6、3、2、1分。我们推测这可能会考写最短shellcode、达成最低延迟等。

比赛每5分钟为一轮,每轮每个服务,攻击成功一个队伍可以获得1攻击分,没有队伍攻击成我方服务获得1防御分。总分=40%攻击分+40%防御分+20% KoH分。我们推测攻击分最高队伍获得400分,其他队伍按照比例得分;防御分、KoH分类似。

服务随着被利用程度(与能利用的队伍数目有关)会变色:绿、黄、橙、红,变成红色后可能会下架服务。因为服务器带宽限制、计算资源限制(后来得知本次比赛使用两台服务器,但需要服务24支队伍)和运维复杂性,同时开放的题目不能太多。以往服务往往莫名其妙就下架了,这次有个颜色渐变,是个亮点。

结束后的portal个题目颜色

与DEFCON 21~23 CTF Finals不同(24为CGC、25为cLEMENCy,非常规平台),队伍不能ssh各自的gamebox替换服务,需要通过主办方提供的方式(根据主办方发放的private key访问github private repo,后来改成HTTP POST)patch服务。每次patch时主办方会检查合法性。如果patch后影响功能,会被revert。

不允许往其他队伍机器接入网线。如果发现这类不正当行为,可能会被长期ban(>1年)不能参加比赛。

portal

互联网和比赛内网使用同一根网线,但今年主办方没有使用VLAN隔离。riatre和我9:00到达现场,稍晚6人和我们汇合

入场后发现网络不通。因为网络问题主办方推迟到了11:00。最早开放的题目是King of the Hill类型的reverse。每轮每支队伍有12枚coins,投放一枚coin可以玩一次,是个x86-32 x86-64的disassemble选择题游戏,猜指令、指令地址等。有队伍先玩到了90分,我通过r2/pwntools disassemble可以玩到100多分,但不久就有队伍研制出自动化可以弄到600多分。服务端程序明显有bug,有时会有重复选项,有时会有错误选项。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
We are at level 4
Time remaining: 60, score: 1960
Lines:
0x8465eae: mov ecx, dword [edx]
0x8465eb0: mov edx, dword [edx+0x4]
?????????: cmp edx, 0xfffffffa
0x8465eb6: je 0x8466010

0xba9fb: 4889740??8 mov qword [rdx+rcx+0x8], rsi
Choices (4):
0. '0x8465eb5\x003 b8 35 '
1. '0x8465eb3\x00b 57 64 \x00[esp+0x1c ]'
2. '0x8465eb2\x009 70 a0 \x00x10ef51]'
3. '0x8465eb7\x009 c8 cf '
4. '0x8465eaf\x00f 11 b2 '
I think the answer is: 0x8465eb4
Cannot solve: no solution?. Saving...
赛后Fish Wang告诉我应该继续逆向,修复程序的功能,利用隐藏指令简化游戏,不需要大力投入到完整的solver上。

BrieflyX根据主办方提供的game_states.json简单处理了下做了个内网portal。我用display: grid;稍微改了改。

新题pointless

1
Description: pointless. Flag location /flag. You may patch up to 200 bytes in the pointless binary.
解压下载的pointless.tgz后有32位EM_MIPS程序,提供了MIPS的/usr/lib/ /lib/,可以用qemu-mips执行。我们发现用一些新qemu-user(如2.12)运行时会在<code_gen_buffer+154742>: movbe ebp,DWORD PTR gs:[ebp+0x0]处SIGSEGV。

16:20发现新题twoplustwo,没有strip,链接了libjemalloc.so.1

1
2
3
4
Description: A very shy calculator. Flag location is /flag, and you may patch up to 24 bytes in the twoplustwo binary.
Your IP: 10.13.37.22
Port: 6969
Type: NORMAL

1
2
3
4
5
6
7
% ./twoplustwo
welcome to the ooo approved calculation.app
approved functionality is limited to printing a duck, repeating a string, adding numbers, multiplying numbers, concatinating strings, exiting, and replacing a single character in your name
any unapproved use of this application is not permitted and will be dealt with swiftly

OOORPC_HELLO(),2: OOORPC_REPEAT_STRING(string, num_times), 3: OOORPC_ADD_NUMBERS(num1, num2), 4: OOORPC_MULTIPLY_NUMBERS(num1, num2), 5: OOORPC_CONCAT_STRINGS(string1, string1), 6: OOORPC_FIND_REPLACE(needle, replace), 7: OOORPC_EXIT(message)
base64([functionidx]\x00[arg?]\x00[arg?]...[yourname])

17:00 reverse能做level 7了  17:10 DEFKOR00T first blood twoplustwo。之后Sauercloud A*0。 17:30到了23200分,但仍然是第三 Congratulations, you have quite some skills you have anything to say in your defense? It was pure luck, I do not deserve this

PPP可以全场打pointless。

19:50开放新题KoH类型题目doublethink,同时原来的reverse被关闭:

1
2
3
4
Description: How many conflicting ideas can you hold in one thought? Files available at oooverflow.io/obey/doublethink.tar.gz.
Your IP: 10.13.37.22
Port: 9318
Type: KING_OF_THE_HILL
这题很有趣,polyglot shellcode。 * 在现代架构(arm64、amd64、mipsel)上选一,攻击成功后 * 在SimH支持的若干古代架构上选一,攻击成功后 * 可以任意选择尚未攻击的古代架构或“未来”架构,持续该过程直到攻击完所有架构或无法攻击成功

可选架构:

1
2
3
4
5
6
7
available = {
'past': { 'lgp-30', 'pdp-1', 'pdp-8', 'pdp-10', 'mix', 'ibm-1401', 'nova' },
'present': { 'amd64', 'arm64', 'mipsel' },
'future': { 'risc-v', 'hexagon', 'mmix', 'clemency' }
}
all_available = set.union(*available.values())
max_control = len(available['past']) + len(available['future']) + 1

对于支持读取文件的架构,会在固定地址读入你的shellcode并执行:

1
2
3
4
5
6
7
8
void *mem = mmap((void *)address, 0x4000, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON, 0, 0);
printf("Reading file into %p...\n", mem);
int read_bytes = fread(mem, 1, max_size, shellcode_file);
printf("Loaded %d bytes of shellcode at %p (tried for %p)...\n", read_bytes, mem, (void *)address);

printf("Executing!\n");

((void(*)())mem)();

对于SimH支持的模拟器,比如pdp-1,在机器字0处读入flag,机器字64处用deposit填入程序,在64处模拟运行。shellcode能打印处flag的字串即可。

1
2
3
4
5
6
7
8
9
10
% ./drive_emu.py pdp-1 flag shellcode
d 0100 356424
d 0101 760200
d 0102 200001
...
d 0 "ooo"
d 01 "fla"
d 02 "g "
run 100
exit

思路是如下编排指令:

  • 架构0的jmp指令,在架构1~n-1上能安全执行(类NOP)
  • 架构1的jmp指令,在架构2~n-1上能安全执行(类NOP)
  • 架构2的jmp指令,在架构3~n-1上能安全执行(类NOP)
  • ……
  • 架构0的shellcode
  • 架构1的shellcode
  • 架构2的shellcode。n个架构的shellcode间顺序无关紧要

但是查找满足的要求的jmp指令很困难。大家搜集各个古老架构的手册、汇编器:

  • GNU MIX Development Kit
  • LLVM+Clang,可以用来处理amd64、arm64、mipsel、hexagon、risc-v
  • SimH中的lgp处理lgp-30,macro1处理pdp-1
  • ……

20:00 Day 1结束。oooverflow的zardus召集各个队伍的队长开会。

后来得知很多队伍发现30000/tcp可以访问“DC 26 Admin Interface”,又是一个主办方的bug。推测通过git repo(用于上传patch)可以下载到题目,但好在git repo也挂了,才没有提前泄漏题目。

8月11日Day 2

9:00入场10:00开赛,但主办方因为网络问题推迟到了大约12:20。

在北京远程参与的f1yyy研制出了amd64+pdp-1 shellcode,可惜没有派上用场。很多队伍都能攻击3、4个架构,PPP有攻击5个队伍的polyglot shellcode。Dragon Sector甚至有9个,后来看到HITCON有11个(amd64 pdp10 pdp8 pdp1 nova mix mmix ibm1401 lgp30 risc-v hexagon)。Dragon Sector的一度被主办方查封,但后来恢复。应该是利用了题目漏洞(各个架构共用同一个flag、没有sandbox隔离两个并发的连接),由一个amd64连接读到的flag往另一个进程的模拟器进程写stdin或stdout,后来与主办方交涉后判作合法了。赛后记者问zardus自己有没有试过能打多少架构,他巧妙地避开了这个话题,回答说每个架构都试过能打。(但是组合起来就不知道了,PPP的非漏洞正宗5个架构很棒)

12:40看起来我们的twoplustwo补好了, Dragon Sector、PwnThyBytes、koreanbadass、r3kapig、pasten、Spaceballs似乎没补字节码注入。 13:00发现新题oooeditor

1
2
3
4
Description: The vim vs emacs religious war finally comes to an end. The Order has mandated the use of OOO Editor. Flag location is /flag, and you may patch up to 10 bytes in the oooeditor binary. The binary is available from oooverflow.io/obey/oooeditor
Your IP: 10.13.37.22
Port: 8297
Type: NORMAL
这是一个酷似radare2的服务,几乎可以肯定是defcon.org官方网站介绍页面的lzcnt ("one of the principal developers of the radare2 binary analysis framework")出的。

如果是非Ubuntu 18.04的Debian系环境,没有libgnustep-base1.25,可以r2 oooeditor -wqc 'w 4 @ 0x4009a7'DT_NEEDED字段patch成1.24运行。

1
2
3
4
5
6
7
8
9
10
% ./oooeditor
[0x00000000]> ls
a.png b.jpg c.elf
d.bz2
[0x00000000]> o a.png
[0x00000000]> p 4
61 2E 70 6E | a.pn
[0x00000000]> p 4 @ 2
70 6E 67 68 | pngh
[0x00000000]>
这个服务用GNU Objective-C编译,链接了GNUStep,大家都不了解这个。在北京远程参与的hankein95推荐我们阅读http://phrack.org/issues/66/4.html

我们很快注意到了out-of-bound read/write。

15:08 PPP first blood。15:17发现还没有人修补oooeditor,我就用r2修补了一下:

1
2
if ((signed int64_t)file_size > offset)
file_contents[pos] = byte;
处的-Wsign-compare问题。

16:20出现新题poool,混入了区块链元素,挖矿赚钱兑换flag:

1
2
3
4
poool
Description: pay per share stratum mining pool. You may patch the poool binary. Each team may only submit 5 patches. Choose wisely. Flag location /flag. Flag format: 000[A-F0-9]{45}. Files available at oooverflow.io/obey/poool.tgz.
Your IP: 10.13.37.22
Port: 10001
赛后slipper说:

  • 不利用漏洞,烧钱开服务器用4096核可以兑换到flag
  • 有个type confusion漏洞
  • 有个-Wsign-compare漏洞,可以直接拿flag
  • 用scanf读取nonce,可以算一次提交很多遍

大约有半小时套房内极路由和有线网断开了。 极路由网络诊断

我们能攻击PwnThyBytes的oooeditor。

18:20出现新题bew。是使用Node.js框架Express.js的web服务(在DEFCON CTF Finals上非常罕见,传统上只考硬核的二进制攻防)。

1
2
3
4
Description: Finally the Thought-CyberCrimes Reporting System is up and running. Report your suspects now, because in the new era even thinking about a cybercrime is punishable. You may patch the express-validator.wasm file. Flag location /flag, and you may patch up to 1024 bytes. Download the service from oooverflow.io/obey/bew.tar.gz
Your IP: 10.13.37.22
Port: 5080
Type: NORMAL

  • 里面用的node_modules/express-validator和实际1.0.0版本不同,多了wasm模块node_modules/express-validator/express-validator.wasmindex.js也有很多集成wasm到js的代码。
  • routes/data.js(/report)可以写入public/suspects.txt
  • routes/suspects.js(/suspects)会读取public/suspects.txt

我们把三个web手唤醒。大家使用wabt等工具分析。Day 2结束后尝试了各种web application firewall逻辑检测恶意代码执行。

18:00多似乎所有队伍的oooeditor都修补了。 19:00主办方宣布oooeditor有pcap了(实际上已经没有用了) 19:15主办方宣布DEFKOR00T first blood了poool。后来得知他们这天就利用了poool的两个漏洞。 19:20宣布每个队伍今天只能修补两次,原因是stratum mining很耗资源(后来得知命题人slipper有个在HT后96核系统上运行2 3分钟的解法,而一轮时间仅为5分钟) 19:27发现PwnThyBytes攻击TokyoWesterns的bew获取了first blood。很快koreanbadass和mhackeroni也能攻击这个服务。

因为开赛浪费了两个小时,主办方把今日比赛从20:00延长到21:00。

20:30出现新题vchat,是个使用gloox的XMPP client。

1
2
3
4
Description: The Order of the Overflow has assigned you a personal virtual assistant. Obey the assistant. You may patch up to 100 bytes in the vbot binary. Files available at oooverflow.io/obey/vchat.tgz **AND AT oooverflow.io/obey/vchat-hint.tgz**. This is a client-server service. The Order runs the *client* on your vulnerable image (on port 2555); the server is on port 5222.
Your IP: 10.13.37.22
Port: 2555
Type: NORMAL

21:00主办方召集各个队伍的队长开会。zardus提到了一些问题:

  • 开赛推迟
  • pointless服务的问题。不过这个名字起得不错,掩饰/解释了这个服务的众多问题。
  • 用于上传patch的git服务的可靠性。第一天结束后连夜赶做了portal页面提交patch的功能。
  • 防御分计算bug。每轮每个服务没被攻击即可得分,但因为一个bug导致每个服务都没被攻击才得分,会修复。
    1
    2
    - was_service_exploited[service.id] = True
    + was_service_exploited[event.service.id] = True
  • 应该还有一些,但我记不起来了

我后来配置了一下XMPP server prosody,不懂XMPP,发现很难和vbot通信,不知道怎么把anonymous模式和starttls调好,倒是发现一个XMPP client profanity高仿irssi/weechat,看起来赏心悦目。后来BrieflyX弄出一个自制简易server可以与vbot通信了,但众人看不出漏洞。赛后知道gloox cache可以导致use-after-free。

8月12日Day 3

2:34 f1yyy说poool可以堆任意读了,6:00多说可以读flag了。

10:00比赛开始,按照惯例,为了留悬念,今天不展示积分榜,但仍然能看到exploitation events。poool的patch次数取消了。我们发现没有队伍能利用vchat。主办方给了vchat的提示,服务端配置是ejabberd SASL ANONYMOUS。

bew主办方把权限配置错误了,有个队伍把其他队伍的文件改了,也有Denial of Service问题。大约12:00主办方关闭了bew。我们研制的若干个bew exploit浪费了。我们的修复也无效TOO_MANY_BYTES,cxm wupco在修复时偷懒寄希望于主办方使用edit distance判断字节限制,很可惜。

发现新题reeducation,是个带符号和调试信息的Rust执行档。

1
2
3
4
Description: You have arrived at the OOO re-education center. You may patch up to 16 bytes in the reeducation binary, available at oooverflow.io/obey/reeducation.
Your IP: 10.13.37.22
Port: 1221
Type: NORMAL

f1yyy的poool exploit可以攻击17个队伍。后来发现有个if ((signed __int64)tmp <= 0x1FFFFFFFFFFLL) bug,可以加很多钱,很多其他队伍利用了这个。

11:15发现新King of the Hill题propaganda。用nc连接后显示可以上传下载服务。不能用telnet连接,如果发送1\r\n会被拒绝请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
% ./propaganda 1

Order through Control.

-------[ OOO Stamp ]------
| . . *. |
| * . + |
| . E * . |
| . * * |
| * . + |
| * * S . |
| . . . . * * |
| .. . . . |
| .+* |
| *x+ |
--------------------------

用选项1下载执行档后发现这个程序把命令行参数、.text .fini和.rodata大部分计算MD5后显示为randomart。如果篡改程序,改变输出的字串Order through Control,就会破坏randomart。有两种思路:

  • 修改.text,设法修复hash
  • 修改__printf_chk的PLT项,跳转到.eh_frame。我们选择了这种,hook这个函数后用rsi-8!=rspformat[0] != 'O'等方式检测是第几个printf调用,发现要输出Order through Control则替换字串。riatre娴熟地patch了交了一个版本上去,排到第五,之后又优化了下。我发现了r2 waf的几处问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# a solution of 45 bytes
# a.r2
wa jmp 0x1920 @ sym.imp.__printf_chk
wa call 0x193a @ 0x1920
wz ORDER OF OBEDIENCE.\n @ 0x1925
waf a.asm @ 0x193a

# a.asm
pop rax
cmp byte [rsp], 0x2b # if return address of the __printf_chk call is what we want to hack
cmovz rsi,rax
jmp [0x201fb8]

# shell
r2 -e 'asm.assembler=x86.ks' -wqi a.r2 propaganda

14:00比赛结束,我去了现场,和riatre、misty找其他队伍聊天,顺便推销ccls。比较可惜的是大部分A*0*E选手都没见到,只看到了Azure (eee)。 他提到主办方提交flag也有bug,有的时候提交同样flag会都显示Accept,第一次提交实质上没有计分,可能是因为每轮flag推送的同步问题导致的。Misty开心地加日本人微信。见到了HITCON和BFS几位队员。iromise和陈仲宽(我没有认出来QAQ)讨论资安社团招新难的话题。

混入了r3kapig的Atum的集体照

16:30 DEFCON闭幕式,按照惯例最后会宣布DEFCON CTF前三名。但我们去得太晚,被goon引导到Track 3,后来被告知"sorry",只好回套房看电视上的dctv (DEF CON TV)。往年我们都忽略了dctv,今年dctv成为DEFCON一个新的 部门,在六个酒店播出:Caesars、Flamingo、Paris、Bally's、Harrah's。一些网络设备用了FreeBSD,但主办方的玩笑(比赛突然变成FreeBSD+ipv6)并没有发生。DEFCON 27将会在Paris、Bally's和Planet Hollywood三地分布式运行。DEF CON China将继续举办。

无意中截到这张图,只有slipper有良好的“认罪”态度,其他人怎么嬉皮笑脸……

Tea Deliverers第6名。

BrieflyX总结说,今年每天都很困,不过好的方面是网络没有出大问题。晚上我们在Joes Seafood Prime Steak & Stone Crab吃饭。

21:00多段老师和刘保君给我们道别,要去赶USENIX Security'18了。感谢他们这几天提供的后勤保障!

23:20 scateu来探望我们,接见了几位清华大学学生网络安全技术协会同学,介绍了他在Blackhat上的演讲,分享了一些段子,给我们带了几个ASRC的骰子,谈论清华大学的修车铺和小卖铺,谈论自己未来安全研究的展望,畅谈到近1:00才回去。

8月13日

早上吃了两个HITCON送的凤梨酥作为早饭(感谢~昨天下午送的,因为准备仓促,没有回礼,很监介。。。)一些队友今日回去,我去San Jose International Airport,riatre和marche147乘坐Delta Air,在Seattle转机回北京。我因为和iromise又检查了下套房众人落下的东西,离开得稍晚了,就被抛下了😭又只好独自打车到机场,好在在机场碰头了,还遇到了A0E (0ops)的谭凌霄。大部队乘坐Korean Air,还有几个报了旅游团在Planet Hollywood住两天再回去。Misty和HITCON乘坐同一个Korean Air航班。我第一次在SJC出发离开,发现有个ride-sharing app的通道。

主办方的过失很多:

  • 网络环境配置。Day2开赛时间拖延了两个小时有点长,以前legitbs从没有拖到过两小时。
  • 不慎暴露的Admin interface。
  • patch上传机制。git repo看起来很酷,但用git post-commit hook实现的话容易出问题。稳健的HTTP POST挺好的,还方便限制提交次数。
  • 分数计算bug。还好数据库记录了原始事件,方便重新计算。
  • 不注意sandbox隔离。
  • 没有注意服务的资源消耗
    • bew Denial of Service很难防。Node.js的单进程服务多个连接的模型在攻防里不好,服务容易被搞坏。后来主办方改成不停重启node,又会导致大量资源消耗。
    • 慎用qemu模拟运行的程序。qemu-mips运行的pointless消耗大量资源。听说主办方原来出了一道x86_64的,但后来有人灵机一动把它改成了32位MIPS。据说PPP利用leak时,曾发现服务端不对劲(x86_64没有被题换成MIPS),之后主办方才修复。

但他们扛下legitbs离开后主办方的大旗,很不容易,为比赛带来新的赛制(血液),感谢他们的辛勤劳动。希望以后能办得更好。

我们自身的问题:

  • 航班延误一天给大家带来时差影响。很多人昏昏沉沉的,不能发挥最佳状态。我虽然没有时差影响,但仿佛水土不服(旁白:请不要找借口)
  • 准备不足。去年(cLEMENCy)提前一天知道规则,做了很多准备,如git repo。今年有所欠缺。
  • 今年Day 1结束后没有总结。

每年八月,放下手头的工作,在Las Vegas见故交新知,并肩作战,折腾平时不想折腾的软件,速成平时用不到的技能,继续发光发热(与其让生命生锈),享受这段时光。