2019 ISITDTU CTF WriteUp
🏆 核心赛事信息
预选赛(Quals):于 2019 年 6 月 29 日至 30 日举行,为期 24 小时。采用线上 Jeopardy(解题) 模式
总决赛(Finals):于 2019 年 8 月 17 日在越南岘港的维新大学举行
奖金:总决赛奖金池为 3,500 美元,冠军将获得 2,000 美元
🏅 总决赛排名
| 排名 | 队伍名称 | 所属国家/地区 | 得分 |
|---|---|---|---|
| 第 1 名 | AyeBeer | 越南 | 6183.000 |
| 第 2 名 | bi0s | 印度 | 6183.000 |
| 第 3 名 | FluxFingers | 德国 | 5705.000 |
| 第 4 名 | PiggyBird | - | 4273.000 |
| 第 5 名 | Aleph Infinite | 韩国 | 3561.000 |
| 第 6 名 | HolyCTF | - | 3209.000 |
| 第 7 名 | dcua | - | 3038.000 |
| 第 8 名 | efiens | - | 2182.000 |
| 第 9 名 | strt0k | - | 1542.000 |
| 第 10 名 | ZigzagStuckRepeat | - | 1343.000 |
| 第 11 名 | OpenToAll | - | 983.000 |
| 第 12 名 | xploiters | - | 676.000 |
Web
easyphp(字符串异或绕过)

源码如下
1 |
|
GET 参数:_
第一层:过滤很多字符
第二层:payload 中不同字符种类不能超过
0xd,也就是 13 种最后:
eval($_)
PHP 中,如果 ^ 两边都是字符串,会逐字符做 ASCII 异或,得到新的字符串
可以使用 %ff 作为基准字节来构造函数名,因为 URL 解码后 %ff 会变成一个高位字节,不会被正则过滤
因此可以构造
1 | print_r(scandir('.')); |
但是这个版本有一个问题:不同字符种类超过 13 种,会被第二层限制拦住
优化思路是:不要只用 %ff ^ xxx,而是用多段异或复用已有字符,减少总字符种类
1 | t = s ^ c ^ d |
这样可以把 print_r 和 scandir 构造成只用 13 种字符的 payload
1 | print_r |

直接访问 .txt 会被 Web 服务器拦,所以不能浏览器直接打开文件。需要在 PHP 内部读取
1 | # end(scandir('.')) 取目录列表最后一个文件 |
