├── .gitignore ├── LICENSE.md ├── README.md ├── archive ├── README.md ├── announcements.md └── core.json ├── misc ├── funny_flags.md ├── images │ ├── 1.png │ └── 2.png └── others.md ├── official ├── RSA_of_Z │ ├── README.md │ ├── images │ │ └── .gitkeep │ └── src │ │ ├── .gitkeep │ │ └── rsaz.tar.gz ├── adversarial │ ├── README.md │ ├── images │ │ ├── .gitkeep │ │ ├── adv1.png │ │ ├── adv2.png │ │ └── human.png │ └── src │ │ ├── .gitignore │ │ ├── .gitkeep │ │ ├── Dockerfile │ │ ├── adversarial.zip │ │ ├── docker-compose.yml │ │ ├── solution │ │ ├── Dockerfile │ │ ├── README.md │ │ ├── main.py │ │ ├── model.pth │ │ ├── pick.py │ │ ├── requirements.txt │ │ ├── solution.png │ │ ├── solution.py │ │ └── target.png │ │ └── webapp │ │ ├── README.md │ │ ├── main.py │ │ ├── model.pth │ │ ├── requirements.txt │ │ ├── target.png │ │ └── webapp.py ├── audiophile │ ├── README.md │ ├── images │ │ └── .gitkeep │ └── src │ │ ├── .gitkeep │ │ ├── audiophile.zip │ │ ├── dr_wav.h │ │ └── stegan.c ├── back_in_time │ ├── README.md │ ├── images │ │ └── .gitkeep │ └── src │ │ ├── .gitkeep │ │ └── input_sequence ├── bank │ ├── README.md │ ├── images │ │ ├── .gitkeep │ │ ├── image-20181016123310265.png │ │ ├── image-20181016123347955.png │ │ └── image-20181016123406691.png │ └── src │ │ ├── .gitkeep │ │ └── bank │ │ ├── app │ │ └── index.php │ │ ├── docker-compose.yml │ │ ├── images │ │ └── nginx │ │ │ └── config │ │ │ └── default.conf │ │ └── services │ │ └── php │ │ ├── Dockerfile │ │ └── config │ │ └── php.ini ├── calculator │ ├── README.md │ ├── images │ │ └── .gitkeep │ └── src │ │ ├── .gitkeep │ │ ├── calc │ │ ├── calc.c │ │ └── calculator │ │ ├── Dockerfile │ │ ├── bin │ │ ├── - │ │ ├── calc │ │ └── flag │ │ ├── ctf.xinetd │ │ ├── docker-compose.yml │ │ └── start.sh ├── card │ ├── README.md │ ├── assets │ │ └── card.png │ ├── images │ │ ├── .gitkeep │ │ └── badge.png │ └── src │ │ ├── .gitkeep │ │ └── fragments.zip ├── catremote │ ├── README.md │ ├── images │ │ ├── .gitkeep │ │ └── image-20181016114941390.png │ └── src │ │ ├── .gitkeep │ │ └── seq.txt ├── confused_flxg │ ├── README.md │ ├── images │ │ ├── .gitkeep │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ └── 6.png │ └── src │ │ ├── .gitkeep │ │ ├── confused_flxg.exe │ │ ├── fixConfused_flxg.py │ │ ├── flxg.txt │ │ └── testcn.cpp ├── docx │ ├── README.md │ ├── images │ │ └── .gitkeep │ └── src │ │ ├── .gitkeep │ │ └── OfficeOpenXML.docx ├── encryption_and_decryption │ ├── README.md │ ├── images │ │ └── .gitkeep │ └── src │ │ ├── .gitkeep │ │ ├── enc_and_dec.tar.gz │ │ └── encryption_and_decryption_solution.py ├── gop_snark │ ├── README.md │ ├── images │ │ └── .gitkeep │ └── src │ │ ├── .gitkeep │ │ └── vkandproofs.zip ├── heicore │ ├── README.md │ ├── images │ │ ├── .gitkeep │ │ ├── image-20181016121046272.png │ │ ├── image-20181016121448185.png │ │ ├── image-20181016121600175.png │ │ ├── image-20181016121711381.png │ │ └── image-20181016121811337.png │ └── src │ │ ├── .gitkeep │ │ └── heicore │ │ ├── app │ │ └── index.php │ │ ├── docker-compose.yml │ │ ├── images │ │ └── nginx │ │ │ └── config │ │ │ └── default.conf │ │ └── services │ │ └── php │ │ ├── Dockerfile │ │ └── config │ │ └── php.ini ├── her_gift │ ├── README.md │ ├── images │ │ └── .gitkeep │ └── src │ │ ├── .gitkeep │ │ ├── exp │ │ ├── exp1 │ │ │ ├── exp1.md │ │ │ ├── hook │ │ │ └── hook.c │ │ └── exp2 │ │ │ ├── exp2.md │ │ │ └── gift_patched │ │ ├── gift │ │ └── src │ │ ├── HOWTO.md │ │ ├── Makefile │ │ ├── gift.c │ │ ├── hid_version_info.py │ │ ├── sha1.c │ │ └── sha1.h ├── her_poem │ ├── README.md │ ├── images │ │ ├── .gitkeep │ │ ├── ability_to_use_google.png │ │ ├── emotion_feeling_hurt.png │ │ ├── uuencoding_wikipedia.png │ │ └── wrong_script.png │ └── src │ │ ├── .gitkeep │ │ ├── exp.py │ │ ├── generate.py │ │ ├── helper.py │ │ ├── poem.txt │ │ └── poem.zip ├── mining_pool_of_Z │ ├── README.md │ ├── images │ │ └── .gitkeep │ └── src │ │ ├── .gitkeep │ │ └── mining_pool_of_Z │ │ ├── .gitignore │ │ ├── Dockerfile │ │ ├── app.py │ │ ├── docker-compose.yml │ │ ├── static │ │ ├── hashes.js │ │ └── jquery-3.3.1.min.js │ │ └── templates │ │ └── index.html ├── ohmycat │ ├── README.md │ ├── images │ │ ├── .gitkeep │ │ ├── image-20181016012607646.png │ │ ├── image-20181016012829431.png │ │ ├── image-20181016012937555.png │ │ └── image-20181016013016568.png │ └── src │ │ ├── .gitkeep │ │ └── typed_printf.cpp ├── permission │ ├── README.md │ ├── images │ │ └── .gitkeep │ └── src │ │ ├── .gitkeep │ │ ├── b.rs │ │ └── rev ├── python_simulator │ ├── README.md │ ├── assets │ │ └── cat.gif │ ├── images │ │ └── .gitkeep │ └── src │ │ ├── .gitkeep │ │ └── python_simulator │ │ ├── Dockerfile │ │ ├── bin │ │ └── pysim.py │ │ ├── ctf.xinetd │ │ ├── docker-compose.yml │ │ └── start.sh ├── qiandao │ ├── README.md │ ├── images │ │ ├── .gitkeep │ │ ├── image-20181016015633115.png │ │ ├── image-20181016015820553.png │ │ └── image-20181016020015148.png │ └── src │ │ ├── .gitkeep │ │ └── qiandao │ │ ├── app │ │ └── index.php │ │ ├── docker-compose.yml │ │ ├── images │ │ └── nginx │ │ │ └── config │ │ │ └── default.conf │ │ └── services │ │ └── php │ │ ├── Dockerfile │ │ └── config │ │ └── php.ini ├── red_stone │ ├── README.md │ ├── assets │ │ └── boom.png │ ├── images │ │ ├── .gitkeep │ │ └── circuit.png │ └── src │ │ ├── .gitkeep │ │ └── res_stone.zip ├── secret_of_flxg │ ├── README.md │ ├── images │ │ └── .gitkeep │ └── src │ │ ├── .gitkeep │ │ ├── flxg.c │ │ ├── flxg.txt │ │ └── lock.c ├── trial_of_cwk │ ├── README.md │ ├── images │ │ └── .gitkeep │ └── src │ │ ├── .gitkeep │ │ ├── poc.py │ │ ├── trial.c │ │ └── trial.webp ├── true_flxger │ ├── README.md │ ├── images │ │ └── .gitkeep │ └── src │ │ ├── .gitkeep │ │ ├── flxg.hell │ │ └── malbolge.txt ├── ustcquiz │ ├── README.md │ ├── images │ │ └── .gitkeep │ └── src │ │ ├── .gitkeep │ │ └── ustcquiz │ │ ├── app │ │ └── index.php │ │ ├── docker-compose.yml │ │ ├── images │ │ └── nginx │ │ │ └── config │ │ │ └── default.conf │ │ └── services │ │ └── php │ │ ├── Dockerfile │ │ └── config │ │ └── php.ini └── who_am_i │ ├── README.md │ ├── images │ ├── .gitkeep │ └── little_busters_kud_can_i_help_me.png │ └── src │ ├── .gitkeep │ └── who_am_i │ ├── Dockerfile │ ├── app.py │ ├── docker-compose.yml │ └── templates │ └── index.html └── players ├── Ciel └── README.md ├── ProfFan ├── README.md ├── adversarial.py ├── audiophile.ipynb ├── encdec.ipynb └── stegan.png ├── coxxs ├── A29C7ED4-bank0.png ├── A29C7ED4-bank1.png ├── A29C7ED4-bank2.png ├── A29C7ED4-bank4.png ├── A29C7ED4-flxg1.png ├── A29C7ED4-flxg2.png ├── A29C7ED4-flxg3.png ├── A29C7ED4-flxg4.png ├── A29C7ED4-flxg5.png ├── A29C7ED4-heicore7.png ├── A29C7ED4-heicore8.png ├── A29C7ED4-kuang2.png ├── A29C7ED4-kuang3.png ├── A29C7ED4-kuang4.png ├── A29C7ED4-kuang5.png ├── A29C7ED4-kuang6.png ├── README.md ├── heicore1.png ├── heicore2.png ├── heicore3.png ├── heicore4.png ├── heicore5.png ├── heicore6.png ├── kuang1.png └── pdf_format1.png ├── cvhc ├── README.md ├── adversial │ ├── sample.png │ ├── save.png │ └── target.png ├── catremote │ ├── catremote.py │ └── final.png ├── encryption_and_decryption │ ├── out.c │ └── solve.py └── mining_pool_of_Z │ ├── gpu-brute │ ├── gpu-brute │ ├── gpu-brute.cpp │ ├── hash_compare.cl │ └── miner.py │ └── sha256-blockchain │ ├── bitcoin-block-parser-online.py │ ├── bitcoin-block-parser.py │ ├── find-collision.cpp │ └── show-block-db.py ├── dl └── README.md ├── fatykrch ├── Malbolge │ ├── 233.jpg │ ├── README.md │ └── draw_malbolge.py ├── README.md ├── adversarial │ ├── README.md │ ├── adversarial.py │ ├── main.py │ ├── model.pth │ ├── sample.png │ └── target.png ├── bank │ └── README.md ├── confused_flxg │ ├── README.md │ ├── confused_flxg.exe │ └── confused_flxg.py ├── enc_and_dec │ ├── README.md │ ├── br.bf │ ├── dec.py │ └── encrypt.bf ├── gift │ ├── README.md │ ├── gift │ └── strings.txt ├── seq │ ├── README.md │ ├── seq.jpg │ ├── seq.py │ └── seq.txt ├── snake │ ├── README.md │ └── snake.py ├── trail │ ├── README.md │ ├── extract_trial.py │ ├── remote.py │ ├── trial │ ├── trial.webp │ ├── trial2.png │ ├── trial_patched │ └── trialdata ├── typed_printf │ ├── README.md │ ├── typed_printf.cpp │ ├── typed_printf.py │ └── typed_printf_fixed.cpp └── vkandproofs │ ├── README.md │ └── test.cpp ├── fjw └── README.md ├── jauntyliu └── writeup.md ├── lcy └── Confused_flxg_writeup │ ├── 1.PNG │ ├── 2.PNG │ ├── 3.PNG │ ├── 4.PNG │ ├── 5.PNG │ ├── 6.PNG │ ├── README.md │ ├── fixCondused_flxg.py │ └── flxg.txt ├── myon ├── README.md └── passkey.svg ├── nicekingwei └── README.md ├── pdl └── writeup.md ├── soha ├── README.md ├── audiophile.md ├── calculator.md ├── confused_flxg.md ├── encryption_and_decryption.md ├── her_gift.md ├── images │ ├── 124731297.png │ ├── 1281997036.png │ ├── 1429292297.jpg │ ├── 160011773.png │ ├── 1710366700.png │ ├── 1864837544.png │ ├── 1882380561.png │ ├── 1962830901.png │ ├── 1994848494.png │ ├── 2219885828.png │ ├── 2533851744.png │ ├── 2572283108.png │ ├── 2639092579.png │ ├── 2702735753.png │ ├── 2758521703.png │ ├── 3146243909.png │ ├── 3148723092.png │ ├── 3227366260.png │ ├── 3266749685.png │ ├── 3376090344.png │ ├── 3723102722.png │ ├── 3776385642.png │ ├── 3937169843.png │ ├── 4118228921.png │ ├── 4210065068.png │ ├── 4275067853.png │ ├── 4276237654.png │ ├── 441423199.png │ ├── 831079774.png │ ├── 88641739.png │ ├── 909917520.png │ ├── 93953137.png │ ├── 960723743.png │ └── 982647386.png ├── python_simulator.md ├── secret_of_flxg.md └── who_am_i.md └── taoky ├── imgs ├── ability_to_use_google.png ├── emotion_feeling_hurt.png ├── little_busters_kud_can_i_help_me.png ├── uuencoding_wikipedia.png └── wrong_script.png └── writeup.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /archive/README.md: -------------------------------------------------------------------------------- 1 | # 元数据 2 | 3 | 本文件夹包含两部分内容: 4 | 5 | - [core.json](./core.json) 6 | - 由于 2018 年比赛中未标明明确的数据收集政策,`core.json` 中选手的组别均被替换为 `***`。 7 | - [通知](./announcements.md) 8 | -------------------------------------------------------------------------------- /archive/announcements.md: -------------------------------------------------------------------------------- 1 | # 通知 2 | 3 | ## 通知 4 4 | 5 | 经过组委会讨论决定,考虑到学校作息时间,我们将在 10-14(周日)晚 20:00 ~ 10-15(周一)早 7:00 暂时关闭比赛平台,届时选手将无法注册和登录、浏览题目、提交答案等,请各位选手合理安排时间。 6 | 7 | ## 通知 3 8 | 9 | 经过组委会讨论决定,现开放国内(包含港澳台地区)高校邮箱(以 .edu.cn/hk/mo/tw 结尾的所有邮箱,以 .edu.my 结尾的部分邮箱)注册,请国内高校选手通过“注册/登录”菜单中的“其他高校”入口注册。部分学校邮箱邮件送达可能较慢,请耐心等待。若注册过程中遇到问题或高校邮箱为其他后缀,请发邮件至 lug@ustc.edu.cn,我们会手工处理。已注册的选手均不受影响。 10 | 11 | ## 通知 2 12 | 13 | 经过组委会讨论决定,由于比赛人数已超过预期,我们暂时关闭“其他”类用户注册,“注册/登录”菜单中列出的高校的参赛选手仍可继续报名参赛,不受影响。 14 | 15 | ## 通知 1 16 | 17 | 经过组委会讨论决定,几位同学因违反比赛规定被我们取消了比赛资格,他们提交的 flag 已经撤回,所以部分题目通过人数可能有变化。申诉邮件地址:lug@ustc.edu.cn。 18 | -------------------------------------------------------------------------------- /misc/funny_flags.md: -------------------------------------------------------------------------------- 1 | # 搞笑 flag 合集 2 | 3 | 以下为一些错误的 flag 提交: 4 | 5 | `flag{ne_traduka5_fal5a_f1ag0}` 6 | 7 | `flag{hackergame2018}` 8 | 9 | `flag{Thi5_is_A_F4k3_flag}` 10 | 11 | `flag{HoL1P_THerE_1s_N0_F1a9}` 12 | 13 | `flag{1_4m_5e1f_c015in9}` “我自闭了”? 14 | 15 | `拒绝 Python!` 16 | 17 | `flag{RSA_is_simp1e}` 大家猜 flag 能力太强了,以后出题不敢用简单 flag 了 18 | 19 | `FLAG{Math is simple, right? OwO}` 我们以后不妨举办一个 GTF (Guess The Flag) 比赛吧 20 | 21 | `flxg{I_am_A_true_flag_66666}` 22 | 23 | `flxg{I have no idea about what this is.}` 24 | 25 | `flxg{fuck}` 下次比赛应该对提交的 flag 做敏感词检测 26 | 27 | `flxg{有意义的字符串}` 中文 flag 还行 28 | 29 | `flxg{cwkjbsgay}` @cwk 30 | 31 | `flxg{Wrong}` 32 | 33 | `flag{Key: Wrong!}` 34 | 35 | `flxg{Key: Wrong!}` 36 | 37 | `flxg{Wrong!}` 你是认真的吗? 38 | 39 | `flxg{flxg{I_am\á_fake_flag_23333}}` 嵌套 flag? 40 | 41 | `flxg{xxxxx}` 42 | 43 | `flag{enter in exception}` 44 | 45 | `flxg{I_am_A_confused_flag_23333}` 46 | 47 | `flxg{33332_galf_ekaf_A_ma_I}` 反过来? 48 | 49 | `flxg{I_am_A_true_flag}` 好好好,你是真 flag 50 | 51 | `flag{♫\t%s\t♫}` 52 | 53 | `flag{Singing songs is good for mental health.}` 54 | 55 | `flag{[Il0VEY9u]}` 56 | 57 | `flag{[i19ve9ou]}` 58 | 59 | `flag{%s}` 60 | 61 | `flag{bra1nfuck}` 62 | 63 | `flag{Division by zero!}` 64 | 65 | `flag{The real flag is in the file "-"}` 66 | 67 | `flag{buffer_overflow}` 68 | 69 | `flag{http://202.38.95.46:12001}` 我们的题目地址怎么成了 flag 70 | 71 | `flxg{%016lx%016lx}` 嗯,源代码里的确有这个,然后呢 72 | 73 | `flag{复蹇无妄晋遁井坎渐需睽大过}` 74 | 75 | `flxg{ustc}` 76 | 77 | `flxg{cWk}` 78 | 79 | `flag{base64}` 80 | 81 | `flag{I_hate_cats}` 好了我知道了 82 | 83 | `8.466349449149737e+27` 这是什么天文数字? 84 | 85 | `flag{????????????}` ????????? 86 | 87 | `Life_is_short_use_PYTHON` 猜 flag 的高手啊,非常接近正确答案了,服气 88 | 89 | `flag{Timeout!}` 90 | 91 | `flag{i_hack_myself}` 92 | 93 | `flag{Broken pipe}` 这个真的笑死我了,可以参选年度最佳 flag 94 | 95 | `flag{invalid syntax}` 96 | 97 | `flag{Your answer is wrong!}` 98 | 99 | `flag{Life_1s_sh0rt_use_PYTH0NLife_1s_sh0rt_use_PYTH0N……}` 还真展开了 100 次 100 | 101 | `flag{I'll make it}` 102 | 103 | `flag{The person who deserves it the most}` 104 | 105 | `flag{hacklug}` 你想黑什么? 106 | 107 | `flag{:)}` 神秘的微笑? 108 | 109 | `flag{University of Science and Technology of China}` 110 | 111 | `flag{gpa}` 112 | 113 | `flag{4.3}` 114 | 115 | `flxg{eof}` 116 | 117 | `flxg{废理兴工永不放弃}` 118 | 119 | `flxg{大成功}` 120 | 121 | `flxg{whoflxgThose}` 122 | 123 | `flxg{g00dj06}` 124 | 125 | `flxg{Malbolge_i3_eZ}` 我觉得并不 eZ 126 | 127 | `flxg{proof_works}` 128 | 129 | `flag{who I am}` 130 | 131 | `flag{Who am I?}` 132 | 133 | `flag{Can you tell me who I am?}` 134 | 135 | `flag{hacker}` 136 | 137 | `flag{csrfmiddlew}` 138 | 139 | `flag{Werkzeug/0.14.1 Python/3.6.6}` 140 | 141 | `flag{NFS-or-IIS}` 142 | 143 | `flag{again}` 144 | 145 | `flag{小T}` 146 | 147 | `flag{repeater}` 148 | 149 | `flag{复读机}` 150 | 151 | `flag{best language in the world}` 152 | 153 | `flag{main.js}` 154 | 155 | `flag{not_sure}` 156 | 157 | `flag{not_really_sure}` 158 | 159 | `flag{no_answer}` 160 | 161 | `flag{君の名は}` 162 | 163 | `1' or '1'='1` 你想对比赛平台做什么? 164 | 165 | `flag{FLAG.txt}` 166 | 167 | `flag{为了文档安全,请使用最新版本黑曜石浏览器(HEICORE)访问。}` 168 | 169 | `flag{heicoreisthebestcoreintheworld}` 谢谢夸奖 170 | 171 | `flag{Gr33n_h4t_f0r_y0u}` 为什么?为什么? 172 | 173 | `flag{no_google_api_key}` 174 | 175 | `flag{meiyouHEICOREliulanqi}` 176 | 177 | `flag{PAGE NOT FOUND 404}` 178 | 179 | `flag{infiniteloop}` 180 | 181 | `flag{huashui_is_hAppY}` 我也划水 182 | 183 | `flag{success}` 184 | 185 | `flag{MineCraft}` 186 | 187 | `flag{
}` 188 | 189 | `flag{20CTB}` 190 | 191 | `flag{w13gcft4nkj87u6,/lp0o9--=l[}` 这是猫咪在键盘上乱按的。。。 192 | 193 | `flag{请问要铲屎吗?猫咪}` 194 | 195 | `flags": [{"pk": 11, "name": "", "score": 50, "user_solved": 1375}` 是挺像 196 | flag 的 197 | -------------------------------------------------------------------------------- /misc/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/misc/images/1.png -------------------------------------------------------------------------------- /misc/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/misc/images/2.png -------------------------------------------------------------------------------- /misc/others.md: -------------------------------------------------------------------------------- 1 | # 其他花絮 2 | 3 | “程序员的自我修养”已经成为了图书馆本月热搜词的第一名 4 |  5 | 6 |  -------------------------------------------------------------------------------- /official/RSA_of_Z/images/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/RSA_of_Z/images/.gitkeep -------------------------------------------------------------------------------- /official/RSA_of_Z/src/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/RSA_of_Z/src/.gitkeep -------------------------------------------------------------------------------- /official/RSA_of_Z/src/rsaz.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/RSA_of_Z/src/rsaz.tar.gz -------------------------------------------------------------------------------- /official/adversarial/images/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/adversarial/images/.gitkeep -------------------------------------------------------------------------------- /official/adversarial/images/adv1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/adversarial/images/adv1.png -------------------------------------------------------------------------------- /official/adversarial/images/adv2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/adversarial/images/adv2.png -------------------------------------------------------------------------------- /official/adversarial/images/human.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/adversarial/images/human.png -------------------------------------------------------------------------------- /official/adversarial/src/.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | __pycache__/ 3 | data/ 4 | sample.png 5 | -------------------------------------------------------------------------------- /official/adversarial/src/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/adversarial/src/.gitkeep -------------------------------------------------------------------------------- /official/adversarial/src/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:artful 2 | MAINTAINER SIYUAN-ZHUANG USTC-1411 3 | ENV LC_ALL=C.UTF-8 4 | 5 | RUN apt-get update 6 | RUN apt-get install --yes python3.6 python3.6-dev python3-pip python3-openssl 7 | COPY ./webapp /webapp 8 | WORKDIR /webapp 9 | RUN pip3 install -r requirements.txt 10 | ENTRYPOINT ["python3"] 11 | CMD ["webapp.py"] 12 | -------------------------------------------------------------------------------- /official/adversarial/src/adversarial.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/adversarial/src/adversarial.zip -------------------------------------------------------------------------------- /official/adversarial/src/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | web: 4 | build: . 5 | ports: 6 | - "12004:5000" 7 | restart: always 8 | -------------------------------------------------------------------------------- /official/adversarial/src/solution/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:artful 2 | MAINTAINER SIYUAN-ZHUANG USTC-1411 3 | ENV LC_ALL=C.UTF-8 4 | 5 | RUN apt-get update 6 | RUN apt-get install --yes python3.6 python3.6-dev python3-pip python3-openssl 7 | COPY . /solution 8 | WORKDIR /solution 9 | RUN pip3 install -r requirements.txt 10 | ENTRYPOINT ["python3"] 11 | CMD ["solution.py"] 12 | -------------------------------------------------------------------------------- /official/adversarial/src/solution/README.md: -------------------------------------------------------------------------------- 1 | 这个目录内部包括参考答案 `solution.py` 和其它依赖文件。 2 | 目录同时包含了 `Dockerfile`, 用户可以用以下方式检验答案: 3 | 4 | ```bash 5 | docker build -t solution . 6 | ``` 7 | 8 | ```bash 9 | docker run -it solution 10 | ``` -------------------------------------------------------------------------------- /official/adversarial/src/solution/model.pth: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/adversarial/src/solution/model.pth -------------------------------------------------------------------------------- /official/adversarial/src/solution/pick.py: -------------------------------------------------------------------------------- 1 | # 这个文件和答案无关,只是展示获取 target.png 的方式 2 | from __future__ import print_function 3 | import torch 4 | from torchvision import datasets, transforms 5 | import numpy as np 6 | from PIL import Image 7 | 8 | test_loader = torch.utils.data.DataLoader( 9 | datasets.MNIST('data', train=False, transform=transforms.Compose([ 10 | transforms.Resize((30, 30)), 11 | transforms.ToTensor(), 12 | # transforms.Normalize((0.1307,), (0.3081,)), 13 | ])), batch_size=1, shuffle=False) 14 | 15 | for i, (data, target) in enumerate(test_loader): 16 | if i != 534: 17 | continue 18 | else: 19 | data = (np.array(data).reshape(30, 30) * 255).astype(np.uint8) 20 | img = Image.fromarray(data, mode='L') 21 | img = img.resize((600, 600), resample=Image.BILINEAR) 22 | img.save('target.png') 23 | break 24 | -------------------------------------------------------------------------------- /official/adversarial/src/solution/requirements.txt: -------------------------------------------------------------------------------- 1 | http://download.pytorch.org/whl/cpu/torch-0.4.1-cp36-cp36m-linux_x86_64.whl 2 | torchvision==0.2.1 3 | -------------------------------------------------------------------------------- /official/adversarial/src/solution/solution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/adversarial/src/solution/solution.png -------------------------------------------------------------------------------- /official/adversarial/src/solution/solution.py: -------------------------------------------------------------------------------- 1 | """ 2 | 3 | mmmummm mmmm mmsmm mmmm mmmmmm mtm mmcmm mmmmmmmmmmmmm 4 | # m" "m # "# #" " # m" " # "# # # 5 | # # # #mmm#" "#mmm #mmmmm # #mmmm" #mmmmm # 6 | # # # # "# # # # "m # # 7 | # #mm# # "mmm#" #mmmmm "mmm" # " #mmmmm # 8 | 9 | """ 10 | 11 | from __future__ import print_function, division 12 | import torch 13 | import numpy as np 14 | from PIL import Image 15 | import torch.nn.functional as F 16 | 17 | from main import Net 18 | 19 | def solve(): 20 | model = load_model() 21 | image = Image.open('target.png') 22 | image = convert2tensor(image) 23 | inputs = preprocess_image(image) 24 | label = torch.tensor([6], dtype=torch.long) 25 | 26 | # A solution for part 1 27 | inputs.requires_grad = True 28 | x = (inputs - 0.1307) / 0.3081 # scale mean & std 29 | output = model(x) 30 | loss = F.nll_loss(output, label) 31 | loss.backward() 32 | x_grad = torch.sign(inputs.grad.data) 33 | epsilon = 0.18 34 | inputs = torch.clamp(inputs + epsilon * x_grad, 0, 1) 35 | 36 | inputs = inputs.reshape(30, 30) 37 | 38 | for i in range(30): 39 | for j in range(30): 40 | image[int((i + 0.5) * 20), int((j + 0.5) * 20)] = inputs[i, j] 41 | 42 | return image 43 | 44 | def convert2tensor(image): 45 | return torch.from_numpy(np.array(image).astype('f') / 255.) 46 | 47 | def convert2image(arr): 48 | return Image.fromarray((arr.detach().numpy() * 255).astype(np.uint8), mode='L') 49 | 50 | def preprocess_image(arr): 51 | image = convert2image(arr) 52 | image = image.resize((30, 30), resample=Image.NEAREST) 53 | return convert2tensor(image).reshape(1, 1, 30 ,30) 54 | 55 | def load_model(): 56 | model = Net() 57 | model.load_state_dict(torch.load('model.pth')) 58 | model.eval() 59 | return model 60 | 61 | def check(): 62 | model = load_model() 63 | 64 | target = convert2tensor(Image.open('target.png')) 65 | sample = convert2tensor(Image.open('sample.png')) 66 | assert torch.sum(target != sample) < 600 * 600 * 0.002, 'Input hacking is detected! Game over.' 67 | assert F.l1_loss(target, sample) < 0.001, 'Input hacking is detected! Game over.' 68 | assert (torch.max(torch.abs(target - sample))) < 0.2, 'Input hacking is detected! Game over.' 69 | target = preprocess_image(target) 70 | sample = preprocess_image(sample) 71 | # A solution for part 2 72 | target = (target - 0.1307) / 0.3081 73 | sample = (sample - 0.1307) / 0.3081 74 | 75 | truth = torch.argmax(model(target)) 76 | hack = torch.argmax(model(sample)) 77 | assert int(truth) != int(hack), 'Fail to hack. Game over.' 78 | print('Cong! You win!!!') 79 | 80 | 81 | if __name__ == '__main__': 82 | output = solve() 83 | convert2image(output).save('sample.png') 84 | # You have to pass this check! 85 | check() 86 | -------------------------------------------------------------------------------- /official/adversarial/src/solution/target.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/adversarial/src/solution/target.png -------------------------------------------------------------------------------- /official/adversarial/src/webapp/README.md: -------------------------------------------------------------------------------- 1 | 这个目录内部包括网页交互相关的代码。 -------------------------------------------------------------------------------- /official/adversarial/src/webapp/model.pth: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/adversarial/src/webapp/model.pth -------------------------------------------------------------------------------- /official/adversarial/src/webapp/requirements.txt: -------------------------------------------------------------------------------- 1 | http://download.pytorch.org/whl/cpu/torch-0.4.1-cp36-cp36m-linux_x86_64.whl 2 | torchvision==0.2.1 3 | flask==1.0.2 4 | -------------------------------------------------------------------------------- /official/adversarial/src/webapp/target.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/adversarial/src/webapp/target.png -------------------------------------------------------------------------------- /official/adversarial/src/webapp/webapp.py: -------------------------------------------------------------------------------- 1 | import io 2 | import time 3 | from flask import Flask, request 4 | 5 | import numpy as np 6 | from PIL import Image 7 | import torch 8 | import torch.nn.functional as F 9 | 10 | from main import Net 11 | 12 | app = Flask(__name__) 13 | app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 # Limit file size. 14 | 15 | def convert2tensor(image): 16 | return torch.from_numpy(np.array(image).astype('f') / 255.) 17 | 18 | def convert2image(arr): 19 | return Image.fromarray((arr.detach().numpy() * 255).astype(np.uint8), mode='L') 20 | 21 | def preprocess_image(arr): 22 | image = convert2image(arr) 23 | image = image.resize((30, 30), resample=Image.NEAREST) 24 | return convert2tensor(image).reshape(1, 1, 30 ,30) 25 | 26 | def load_model(): 27 | model = Net() 28 | model.load_state_dict(torch.load('model.pth')) 29 | model.eval() 30 | return model 31 | 32 | def check(sample_file): 33 | time.sleep(1) # negative optimization 34 | model = load_model() 35 | 36 | target = convert2tensor(Image.open('target.png')) 37 | sample = convert2tensor(Image.open(sample_file)) 38 | assert torch.sum(target != sample) < 600 * 600 * 0.002, 'Input hacking is detected! Game over.' 39 | assert F.l1_loss(target, sample) < 0.001, 'Input hacking is detected! Game over.' 40 | assert (torch.max(torch.abs(target - sample))) < 0.2, 'Input hacking is detected! Game over.' 41 | target = preprocess_image(target) 42 | sample = preprocess_image(sample) 43 | target = (target - 0.1307) / 0.3081 44 | sample = (sample - 0.1307) / 0.3081 45 | truth = torch.argmax(model(target)) 46 | hack = torch.argmax(model(sample)) 47 | assert int(truth) != int(hack), 'Fail to hack. Game over.' 48 | 49 | @app.route('/', methods=['GET', 'POST']) 50 | def upload_file(): 51 | if request.method == 'POST': 52 | try: 53 | file = request.files['file'] 54 | in_memory_file = io.BytesIO() 55 | file.save(in_memory_file) 56 | check(in_memory_file) 57 | return "flag{Go down the rabbit hole of deep learning}" 58 | except: 59 | return 'FAIL (return in 3 sec...)' 60 | return ''' 61 | 62 |(界面美工师带着正版Adobe全家桶跑路了)
65 | 69 | ''' 70 | 71 | if __name__ == '__main__': 72 | app.secret_key = 'this_is_not_the_real_key_on_the_server' 73 | app.run(threaded=True, host='0.0.0.0', port=5000) 74 | -------------------------------------------------------------------------------- /official/audiophile/images/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/audiophile/images/.gitkeep -------------------------------------------------------------------------------- /official/audiophile/src/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/audiophile/src/.gitkeep -------------------------------------------------------------------------------- /official/audiophile/src/audiophile.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/audiophile/src/audiophile.zip -------------------------------------------------------------------------------- /official/back_in_time/README.md: -------------------------------------------------------------------------------- 1 | # 回到过去 2 | 3 | 那些发明Unix操作系统的大叔们怎么编辑文本文件呢? 4 | 5 | 据记载,他们使用一种叫做ed的神奇编辑器,而Unix Hater's Handbook对此有生动的描述: 6 | 7 | Ken Thompson has an automobile which he helped design. Unlike most automobiles, it has neither speedometer, nor gas gauge, nor any of the other numerous idiot lights which plague the modern driver. Rather, if the driver makes a mistake, a giant “?” lights up in the center of the dashboard. “The experienced driver,” says Thompson, “will usually know what’s wrong.” 8 | 9 | 也许是八十年代的某天,调皮的Lawrence正在使用他的DEC VT终端连接到一台大型Unix主机编辑文件——他是个机灵的家伙,使用ed的时候从不需要看屏幕的输出。只看他正在用ed写本题的flag。写了半天,兴高采烈的Lawrence接了个电话,关上ed才发现自己没有保存。 10 | 11 | 聪明的你能根据对他键盘的记录,还原出你要找的flag吗? 12 | 13 | **info ed** 命令对于没有使用过ed的你是十分有用的。 14 | 15 | Hint1:有多个字符串的话,就从上到下连成一行提交就好啦。 16 | 17 | Hint2:flag只接受数字和字母。 18 | 19 | [打开题目](src/input_sequence) 20 | 21 | --- 22 | ## 背景和题目设定 23 | 一道简单题目,考察选手对 Unix 环境基本操作的熟悉程度,和对输入输出重定向等的基本理解。 24 | 灵感来源于 *Unix Hater's Handbook*,这也是小 L 同学第一次知道还有 ed 这个~~鬼畜~~编辑器。事实上,当你把环境变量 `$TERM` 设置为一个 `terminfo` 中没有的终端类型时,比如 25 | 26 | ``` 27 | export TERM=vt233 28 | ``` 29 | 30 | 那么各种~~牛鬼蛇神~~编辑器就都不太能正常工作了——比如新手友好的 `nano`: 31 | ``` 32 | Error opening terminal: vt233. 33 | ``` 34 | 35 | 不过友好的 Vim 会猜测你的终端是 ansi,继而在你的终端模拟器上运行。但如果你的终端模拟器是一个毫不解析控制字符的傻终端呢? 36 | 除了用 `cat` 编辑文件,你还可以用 `ed`。 37 | 38 | `ed` 虽然已经埋入历史的尘埃,但是它还是 [Single Unix Specification](https://en.wikipedia.org/wiki/Single_UNIX_Specification) 的一部分。 39 | 40 | ## 一个典型的解题思路 41 | 第一步,看到题面上的提示:*忘记保存文件 *、*ed 编辑器 *、*info ed*、*给定输入序列* 42 | 第二步,去看看 `info ed`: 43 | 44 | > 首先,*ed * 是一个 Line Editor(行编辑器),这意味着用户进行的编辑操作无法在屏幕上得到所见即所得的反馈。*ed * 在内存中维护一个缓冲区,用户所有的修改都会存在缓冲区中,直到 * w filename * 命令将其写入文件。 45 | 46 | > a 命令用于向缓冲区的末尾加入文本,以单独一行的 *.*(英文句点)作为结束输入的标志。 47 | 48 | > *,p* 命令可以向屏幕输出缓冲区的内容。 49 | > *2* (一个单独的行号)用于选择需要修改的行。 50 | > *s/old/new* 可以替换选择行中的 *old* 为 *new*。 51 | > *2m3* (行号 m 行号)命令可以将第 2 行挪到第 3 行后面。特别的,*2m0* 表示把第二行放在第一行前面。 52 | > *q* 命令用于退出 *ed* 编辑器。 53 | > 值得注意的是 *ed* 独特的报错方式:一个大大的 **?**。特别的,一个缓冲区没有保存的 ed 需要两个 *q* 命令才可以退出,第一个 *q* 命令的结果是一个大大的 **?**。 54 | 55 | 第三步,继续看题目的 `input_sequence`: 56 | 57 | ``` 58 | q 59 | ed 60 | a 61 | flag{ 62 | . 63 | a 64 | 44a2b8 65 | a3d9b2[ESC]c 66 | c44039 67 | f93345 68 | } 69 | . 70 | 2m3 71 | 2m5 72 | 2m1 73 | 2 74 | s/4/t 75 | q 76 | q 77 | ``` 78 | 79 | 前面的 q 和 ed 是上一次 ed 会话的残留,我们应该先删去。 80 | 然后发现他没有保存,所以删去末尾的 q,加上 `w flag.txt`,变成这样: 81 | 82 | ``` 83 | a 84 | flag{ 85 | . 86 | a 87 | 44a2b8 88 | a3d9b2ESCc 89 | c44039 90 | f93345 91 | } 92 | . 93 | 2m3 94 | 2m5 95 | 2m1 96 | 2 97 | s/4/t 98 | w flag.txt 99 | q 100 | ``` 101 | 102 | 并且运行 103 | ``` 104 | ed input_sequence && less flag.txt 105 | ``` 106 | 107 | 得到 `flag.txt` 如下: 108 | ``` 109 | flag{ 110 | t4a2b8 111 | c44039 112 | f93345 113 | a3d9b2ESCc 114 | } 115 | ``` 116 | 117 | 发现一个神秘的 `ESCc`,那是什么?那其实是一个 *转义序列*,用来控制终端的行为。在本例中为清屏。值得注意,`ESC` 并不是三个普通的字母,而是一个不可打印字符,而 `less` 为了向用户显示,所以写成 `ESC`,并且用白底标出。所以,如果你直接运行 118 | ``` 119 | cat flag.txt 120 | ``` 121 | 122 | 你将不能看到完整的 flag。 123 | 所以,本题的 flag 是 `flag{t4a2b8c44039f93345a3d9b2}`。 124 | 125 | 可能最后的 Escape Sequence 有些小坑,但是没有这一道小弯弯不就不 *DEC VT 终端* 了?(大雾 126 | -------------------------------------------------------------------------------- /official/back_in_time/images/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/back_in_time/images/.gitkeep -------------------------------------------------------------------------------- /official/back_in_time/src/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/back_in_time/src/.gitkeep -------------------------------------------------------------------------------- /official/back_in_time/src/input_sequence: -------------------------------------------------------------------------------- 1 | q 2 | ed 3 | a 4 | flag{ 5 | . 6 | a 7 | 44a2b8 8 | a3d9b2c 9 | c44039 10 | f93345 11 | } 12 | . 13 | 2m3 14 | 2m5 15 | 2m1 16 | 2 17 | s/4/t 18 | q 19 | q 20 | -------------------------------------------------------------------------------- /official/bank/README.md: -------------------------------------------------------------------------------- 1 | # 猫咪银行 2 | 3 | 这也是猫咪占领世界的计划之一,通过开设猫咪银行出售 flag 来学习人类割韭菜的技巧。 4 | 5 | [打开题目](http://202.38.95.46:12003/) 6 | 7 | --- 8 | 9 | 欢迎来到猫咪系列题目之**猫咪银行**。 10 | 11 | 这道题是一道非常简单的题目,主要是想让同学们了解一些整数溢出的坑。 12 | 13 | **本题的源代码和分析将很快发布,下面只是解题方法。** 14 | 15 | ## 解法 16 | 17 | 简单来说,只需要现兑换 TDSU,购买理财产品,购买时精心构造使得时间溢出为负或者是浮点数,而收益非常大即可。 18 | 19 | 一个 payload 是: 20 | 21 | 22 | 23 |  24 | 25 | 然后时间为负,直接取出即可: 26 | 27 |  28 | 29 |  30 | 31 | 最后换回 CTB,购买 flag,计划通! 32 | 33 | flag: `flag{Evil_Integer._Evil_Overflow.}` 34 | 35 | -------------------------------------------------------------------------------- /official/bank/images/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/bank/images/.gitkeep -------------------------------------------------------------------------------- /official/bank/images/image-20181016123310265.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/bank/images/image-20181016123310265.png -------------------------------------------------------------------------------- /official/bank/images/image-20181016123347955.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/bank/images/image-20181016123347955.png -------------------------------------------------------------------------------- /official/bank/images/image-20181016123406691.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/bank/images/image-20181016123406691.png -------------------------------------------------------------------------------- /official/bank/src/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/bank/src/.gitkeep -------------------------------------------------------------------------------- /official/bank/src/bank/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | services: 3 | php: 4 | build: 5 | context: ./services/php 6 | dockerfile: Dockerfile 7 | volumes: 8 | - ./app:/mnt/app 9 | restart: always 10 | web: 11 | image: nginx:1.11.1 12 | ports: 13 | - "12003:80" 14 | depends_on: 15 | - php 16 | volumes_from: 17 | - php 18 | volumes: 19 | - ./images/nginx/config:/etc/nginx/conf.d 20 | restart: always 21 | -------------------------------------------------------------------------------- /official/bank/src/bank/images/nginx/config/default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name localhost; 4 | root /mnt/app; 5 | index index.php index.html index.htm; 6 | 7 | location / { 8 | } 9 | 10 | location ~ \.php$ { 11 | fastcgi_pass php:9000; 12 | fastcgi_index index.php; 13 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 14 | include fastcgi_params; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /official/bank/src/bank/services/php/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:5.6-fpm 2 | MAINTAINER ustchjy提示:flag 仅由 0154agflPYHMGRCNE_{}
这些字符组成。
提示:flag 格式为 flag{......},只包含字母,其中有且只有两个为大写字母。
4 | 5 | 今天的 App Store 首页故事是《猫咪占领世界》([详情](https://itunes.apple.com/cn/story/id1435731237))。 6 | 7 | SERIOUSLY? 8 | 9 | D 同学不禁开始幻想被猫咪占领的世界:集中营里成群的铲屎官,密密麻麻的 Nepeta cataria([Wikipedia](https://en.wikipedia.org/wiki/Catnip))农田,随意摆放的纸箱子占满了道路…… 10 | 11 | 想想就可怕,不过 D 同学知道人类还有终极秘密武器可以用——猫咪遥控器,有了猫咪遥控器,再多的猫咪也只会乖乖地听人类的话,哈哈哈哈哈~ 12 | 13 | 下面是制作猫咪遥控器的技术总结,需要的原料有: 14 | 15 | - 5mW 6mm 点状激光二极管一个; 16 | - 锂电池一个; 17 | - 导线若干; 18 | 19 | 然后用导线将锂电池和激光二极管连接起来(这一步的目的是让二极管亮起来,不想二极管亮起来的同学可以不连),一个美味的猫咪遥控器就做好了。 20 | 21 | 猫咪遥控器的原理非常简单!撸猫学会曾经有论文给出过结论:[激光笔指向哪里,猫咪就会跑到哪里](https://ftp.ustclug.org/misc/cat_remote.mov)。 22 | 23 | 为了报复猫咪把自己的代码打乱(见:猫咪与键盘),D 同学把猫咪遥控器绑在可以上(UP)下(DOWN)左(LEFT)右(RIGHT)移动的三轴机械臂上,开始使用树莓派(一款基于 Linux 的单片机计算机)控制三轴机械臂,进而控制猫咪在草地上跑来跑去。 24 | 25 | 附件是树莓派上留下的调试输出信息,我们赶到现场时只剩下这个了。 26 | 27 | [打开题目](src/seq.txt) 28 | 29 | --- 30 | 31 | 欢迎来到猫咪系列题目之**猫咪遥控器**。 32 | 33 | 这道题是一道非常简单的题目,主要是想让同学们学会一些程序画图的技巧。 34 | 35 | 根据题目提示,我们需要将控制序列画出来,并且我们根据常识和题目提示,能知道: 36 | 37 | UDLR 分别代表:上(UP)下(DOWN)左(LEFT)右(RIGHT)。 38 | 39 | ## 解法一:传统而可靠的办法 40 | 41 | 找一张纸(需要比较大的),花一下午即可。 42 | 43 | ## 解法二:使用 JS Canvas 44 | 45 | 我觉得这是最简单的一个办法,编程和解题都借助常见的浏览器(比如 Chrome)即可完成,我的解题代码如下: 46 | 47 | ```html 48 | 49 | 50 | 51 | 52 |The flag is: =$flag?>
提示:
4 |1. 本题的浏览器“挖矿”只为演示性目的,几乎不占资源。我们不会以任何形式盗取或浪费大家电脑的算力。
5 |2. 本题如果使用程序求解,对于普通配置的个人电脑,在解法正确且最优的情况下,求解程序的期望运行时间不会超过几分钟。
6 | 7 | Z 同学为了赶上区块链的热潮,自己潜心研究工作量证明(Proof of work)算法,并且发布了三种全新的电子货币。不仅如此,他还写了一个矿池。 8 | 9 | 给专业选手的注释:此题并非 web 题,解题过程不涉及注入、XSS、敏感文件泄露、弱类型等安全问题。 10 | 11 | [打开题目](http://202.38.95.46:12006/) 12 | 13 | --- 14 | 15 | 这道题是我出题花费时间最多,也是我最喜欢的一道题目。我暑假期间编写题目网站、调节每种 Hash 算法的难度、写解题代码、与其他人讨论是否有非预期解法等等,前前后后花了很多天的时间。 16 | 17 | ## 解题思路 18 | 19 | 所谓我发明的新的工作量证明算法,就是服务器给出一个后缀 `suffix`,我需要生成两个随机字符串 `nonce1` 和 `nonce2`,使得 `hash(nonce1+suffix)` 和 `hash(nonce2+suffix)` 相同的二进制位数量超过某一个值,这个值对于不同的 Hash 算法是不一样的 20 | 21 | ### SHA1 22 | 23 | 直接在 Google 搞出来的 sha1 碰撞 [那两个 pdf](https://shattered.io/) 后面加上 `suffix` 提交即可,因为是 Hash 碰撞,所以所有二进制位都是相同的 24 | 25 | ### MD5 26 | 27 | 这次使用已有的 md5 碰撞加上后缀会发现不给你 flag 了。期望解法有两种,一种是按照王小云的论文搞出来一个不完全的碰撞(我没研究),另一种是真的穷举。 28 | 29 | 我是用 C 语言写的穷举程序。为了偷懒,我在 python 解题脚本中生成了一堆 md5 写入一个二进制文件,然后调用 C 程序来穷举,C 程序就只需要算异或和统计二进制位的个数了。在 C 语言中使用 `__builtin_popcountll` 函数统计二进制位中 1 的个数,一条 POPCNT 指令就可以统计 64 bit,速度很快,一分钟之内有很大概率可以跑出来。听说有的同学还使用了 GPU 穷举,关于优化这块大家就各显神通了。 30 | 31 | ### SHA256 32 | 33 | 穷举是不可能的,即使你用大型超算都不太可能在比赛时间内跑出来。所以呢?期望解法是从比特币的区块链里面找数据。比特币的工作量证明算法是 sha256,现在区块链里面的每一个区块哈希前面都有大约 80 个二进制 0(多么疯狂啊),所以拿它们来找共同 bit 数很多的哈希值,自带了大约 40 位的加成(因为本来 80 位在期望上也有 40 位是相同的)。你需要想办法下载比特币所有区块的哈希,然后两两配对来看一下相同的 bit 数量。如果达到了题目要求,就是下载它们的区块头部,区块头部的两次 sha256 就是最终的 hash,你需要计算一次 sha256,然后结果就是你要提交的数据。不过,我们还是需要满足一个字符的 suffix 要求,这个只要你不断 getjob,总是可以很快拿到你想要的 suffix 的。 34 | 35 | 解题脚本:https://github.com/zzh1996/mining_pool_of_Z/blob/master/solution/solve.py 36 | 37 | 注:我设计题目和分析的过程都可以在上面这个仓库中找到 38 | -------------------------------------------------------------------------------- /official/mining_pool_of_Z/images/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/mining_pool_of_Z/images/.gitkeep -------------------------------------------------------------------------------- /official/mining_pool_of_Z/src/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/mining_pool_of_Z/src/.gitkeep -------------------------------------------------------------------------------- /official/mining_pool_of_Z/src/mining_pool_of_Z/.gitignore: -------------------------------------------------------------------------------- 1 | log 2 | -------------------------------------------------------------------------------- /official/mining_pool_of_Z/src/mining_pool_of_Z/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:latest 2 | RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list 3 | RUN apt update && apt install -y python3-pip && pip3 install flask 4 | COPY . /srv 5 | WORKDIR /srv 6 | CMD ["python3", "app.py"] 7 | -------------------------------------------------------------------------------- /official/mining_pool_of_Z/src/mining_pool_of_Z/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | web: 4 | build: . 5 | ports: 6 | - "12006:5000" 7 | volumes: 8 | - ./log:/log 9 | restart: always 10 | -------------------------------------------------------------------------------- /official/ohmycat/README.md: -------------------------------------------------------------------------------- 1 | # 猫咪和键盘 2 | 3 | 谨以此题,献给所有被猫破坏的代码。 4 | 5 | 众所周知,猫咪最喜欢钻纸箱和趴键盘,其中钻纸箱没有太大的社会危害性,而趴键盘则是对人类的毁灭性打击。 6 | 7 | (想象一下这里配了猫钻纸箱和趴键盘的图) 8 | 9 | 写到一半的代码离奇消失,仅剩的代码也被搞得乱七八糟,愤怒的 D 同学刚要捉住罪魁祸首,准备好好揍它一顿,不料这时猫咪又突w13gcft4n kj87u6,/lp0o9--=l[ 10 | 11 | [打开题目](src/typed_printf.cpp) 12 | 13 | --- 14 | 15 | 欢迎来到猫咪系列题目之**猫咪和键盘**。 16 | 17 | 这道题是一道非常简单的题目,主要是想让同学们学会一些文本编辑的技巧。 18 | 19 | ## 解法一:一种原始而可靠的办法 20 | 21 | 经过粗略观察,我们就可以发现这应该是一个 C++ 源代码,而代码被以“若干列”为单位打乱了。 22 | 23 |  24 | 25 | 我们的思路也很简单,就是先以“若干列”为单位将代码还原。 26 | 27 | 第一步:打印代码; 28 | 29 |  30 | 31 | 第二步:裁剪代码; 32 | 33 |  34 | 35 | 第三步:我编不下去了…… 36 | 37 |  38 | 39 | 当然,只要足够有耐心,这个方法确实是原始而可靠的。 40 | 41 | ## 解法二:文本编辑器的进阶技巧 42 | 43 | 21 世纪,许多编辑器都提供了“列编辑”模式,就我所知,以下常见的编辑器都是支持列编辑模式的: 44 | 45 | ### VS Code 46 | 47 | Windows/Linux: 48 | 49 | - `Alt + 鼠标左键` :可以添加多个光标; 50 | - `Shift + Alt + 拖动鼠标左键`:可以选中多列; 51 | 52 | macOS: 53 | 54 | - `shift + option + 左键`:可以选中多列; 55 | 56 | ### Sublime Text 57 | 58 | - `Shift + 鼠标右键`; 59 | - `鼠标中键`; 60 | 61 | - 选中需要进行列编辑的多行,然后按下 `Ctrl + Shift + L`; 62 | 63 | ### Vim 64 | 65 | - Normal mode: `Ctrl + v` 66 | 67 | ### Emacs 68 | 69 | 直接(或使用 `C-x SPC`)选定矩形区域的左上角和右下角, 70 | 71 | - `C-x r k` 剪切该矩形选区; 72 | - `C-x r y` 插入矩形选区。 73 | 74 | 任选一款文本编辑器,都可以轻松将代码还原。 75 | 76 | 还原后的代码大概长这个样: 77 | 78 | ```cpp 79 | /* 80 | * name: typed_printf.cpp 81 | * compile: g++ -std=c++17 typed_printf.cpp 82 | * title: type safe printf 83 | * author: nicekingwei 84 | * url: aHR0cHM6Ly96anUtbGFtYmRhLnRlY2gvY3BwZHQtcHJpbnRmLw== 85 | * related knowledge: 86 | * - value and type 87 | * value->value: function 88 | * type->value: parametric polymorphism 89 | * type->type: generic 90 | * value->type: dependent type 91 | * - auto 92 | * - if constexpr 93 | */ 94 | #include本题的主要作用是向你展示获取 flag 的一般步骤:
12 |是不是很简单!在本题中,你只要提交 hackergame2018
就可以得到 flag
提示:
4 |1. 本题两个 flag 均由远程服务器提供.
5 |2. 本题两个 flag 均为有意义的字符串.
6 |3. 与服务器交互时请使用 UNIX 换行符.
7 |4. 这不是 HTTP 协议啊喂 (╯‵□′)╯︵┻━┻, nc 命令请了解一下.
8 | 9 | *The CWK History Symposium* 会议上的一篇论文 *On the missing heritages of CWK* 里写道, “…CWK 并没有将他的修为与财富留给子嗣, 因为当时的 FLXG 并没有被世人所理解. 在无人知晓的时候, CWK 远游四海, 于一个孤岛上独自一人建立了一座巍峨宏伟的神庙, 并将有关 FLXG 的宝藏全部埋葬于此. 然后他又利用不为人知的技术, 使这座荒岛看起来平平无奇, 并且还能避开如今的 FLXG 雷达的探测. 根据当时联合国粮食与农业组织 (FAO) 的记录, 那几年太平洋西部海岸洋葱产量锐减. 我们由此推测 CWK 应该使用了当时比较冷门的一个西方魔法, 可以从洋葱中提取能量从而隐藏海域…” 10 | 11 | 当我偶然翻到这篇 paper 的时候, 脑子里电光火石般想起来, 自己曾经在滑稽大学图书馆中借走的一本 *信息安全导论* 中夹着的那一张羊皮纸. 这一瞬间, 我感觉自己的内心里充满了 flag… 没错, 一定是这样的. 这张古老的羊皮纸就是 CWK 留给滑稽大学最宝贵的遗产, 前往 FLXG 神庙的地图! 12 | 13 | 不愧是 CCF (China CWK Federation) 推荐的 A 类会议, 我一边想, 一边往下读, “…CWK 在神庙里设计了试炼, 只有通过的人才有资格成为他的继承人…**据说神庙的设计图被 CWK 用法力嵌入到了指向神庙的地图里.** 关于 CWK 的其他许多传闻逐渐都得到了验证, 而这张宝贵的地图却依旧只是传闻, 在历史上从未出现过…” 14 | 15 | 读至此处, 我心中热血沸腾, 恨不得立马出发, 去 FLXG 神庙一探究竟. 可是转念一想, CWK 出的题目往往都很坑, 又有些踌躇不前. 正好, 最近似乎滑稽大学要举办一个啥比赛, 不若投石问路, 让那些好奇的选手们先去探个险, 看看他们能不能从神庙中站着出来… 16 | 17 | [打开题目](src/trial.webp) 18 | 19 | --- 20 | 21 | ### 神庙设计图,Get! 22 | ##### TL;DR 23 | Tor,nc with proxy,LSB,抠图 24 | ##### 详解 25 | 得到一张webp格式的图片。使用官方工具分析得知此 webp 图片为无损压缩。使用 dwebp 转换为 png 格式。注意,如果有选手使用第三方工具转换而导致后续步骤无法进行,请不要抱怨题目有非预期的错误,相反,您应该给这些第三方工具提 issue。 26 | 27 | 得到 png 后,使用 stegsolve 查看通道。发现绿色通道的 LSB 有明显的隐写痕迹。右下角有一个洋葱地址,中间的神庙区域有明显规律性条纹。实际上这个条纹是因为出题人故意使用 Base64 编码一遍,使得原来二进制中的规律部分更为明显。 28 | 29 | 我不知道为什么很多人都把这个地址和端口号当作 HTTP 协议。没有任何说明的情况下,一个端口并不应该默认为使用 HTTP 协议。这又不是 80 或者 8080 端口..。正确做法应该是使用 nc 连上去,会发现这实际上是一个类似于 pwnable 的一个交互方式。 30 | 31 | 至于如何使用洋葱,这里不再详述,请参考官网教程。一般的洋葱客户端会提供一个 9150 或者 9050 端口的 SOCKS 5 代理服务。使用 nc 的参数或者 proxychains-ng 均可接入。 32 | 33 | 连入后发现提示输入 CRC32。如果输入 webp 图片的 CRC32 会进一步提示设计图纸被藏在图片里。 34 | 35 | 所以我们转向绿色通道中的神庙区域。思路应该比较明显,需要把这片区域的像素抠出来。 36 | 37 | 为降低难度,这片区域已经用纯黑色的边框包围,并且保证了区域内没有纯黑色的像素点。一个最简单的做法是,使用 Photoshop 手动选择一小部分,选区 -> 扩大选区,可以将这片区域内的像素点全部选中。查看一下统计信息,可以发现这片区域内有 249024 个像素点。很明显可以被 8 整除。这是一个正面的提示。然后将这片区域粘贴到一个新的全黑色的背景图片上。保存。然后就可以写 python 脚本处理绿色通道的 LSB 了。 38 | 39 | (此处省略处理脚本) 40 | 41 | 脚本得到的是一个 Base64 的字符串。解码后是一个 ELF 文件。在远程输入 Base64 字符串或者 ELF 的 CRC32 均可得到第一个 flxg。 42 | ### 此小技耳 43 | ##### TL;DR 44 | https://gist.github.com/pzread/2ae0bb3aa5fe0dc69fcf3257c41db944 ,bit flipping attack 45 | ##### 详解 46 | 这道题其实是出题人学习去年 HTICON 里一个技巧的成果 (话说马上又要 HITCON 了)。有两个人做出来有点出人意料(可能有非预期了),不过因为控制好了 SECCOMP,再怎么非预期也不会造成预期之外的危害 23333333 47 | 48 | 这道题功能很简单。首先输入用户名,判断不能为 root,拼接上 hash 后再使用随机的密钥和 IV 做 AES CBC 加密。另一个函数需要输入结果,然后通过密钥和 IV 解密,再比对 hash 正确性。之后判断用户名是否为 root,如果是 root 就直接给 flag。 49 | 50 | 这题有几个漏洞: 51 | 52 | * 首先有整数溢出,溢出的后果是 double free。控制 free 的整数只有 8 位,所以 free 被拒绝 128 次后就可以随便 free 了。 53 | * 其次内存拷贝用的是 strcpy,这个会造成越界。 54 | * 然后就是密码学上的,bit flipping attack。通过更改 IV 可以更改解密后第一个分组的内容。 55 | * 最后就是 HITCON 的奇技*巧,二进制中的 memcmp 实际上是 strcmp。 56 | 57 | double free 不是用来利用的。实际上要注意到 init 里面会调用 mallopt,设置了这个函数会将 free 的 buffer 填充为 0xAA。而这次 malloc 的 buffer 很小,使用了 tcache 后所以需要 free 七次才行。 58 | 59 | 然后通过 strcpy,将 0xAA 复制到目标数组。通过 bit flipping attack 得到 root 的用户名和第一个 0xAA。然后需要绕过 hash 检测。所以我们不停的尝试,直到 hash 以 0x00 开头。这样 strcmp 比较两个空字符串会直接返回 0。 60 | 61 | exp 见 poc.py,代码见 trial.c 62 | 63 | 关于如何做到将 memcmp 偷天换日到 strcmp,可以看 HITCON 的那篇 gist。基本原理就是内核计算 PHDR 的偏移错误,所以可以放上两个 PHDR,真 PHDR 中的 PT_DYNAMIC 中 DT_SYMTAB 被修改了。所以 ld.so 解析函数的时候会使用后面的 DT_SYMTAB,而一般的反汇编工具会使用 ELF Spec 下的 DT_SYMTAB。 64 | 65 | 更详细一点的介绍在这里,http://h3ysatan.blogspot.com/2018/02/quick-notes-hitcon-ctf-2017-qual-elf.html。 66 | ###### 翻车 67 | 果然翻车了, 有个特别简单的非预期解... 排查后发现是 UB 导致的编译器优化把一个边界检查给优化没了... 辣鸡 GCC (╯‵□′)╯︵┻━┻ 68 | 换成 clang 编译就没这么多事了... 69 | -------------------------------------------------------------------------------- /official/trial_of_cwk/images/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/trial_of_cwk/images/.gitkeep -------------------------------------------------------------------------------- /official/trial_of_cwk/src/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/trial_of_cwk/src/.gitkeep -------------------------------------------------------------------------------- /official/trial_of_cwk/src/trial.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/trial_of_cwk/src/trial.webp -------------------------------------------------------------------------------- /official/true_flxger/README.md: -------------------------------------------------------------------------------- 1 | # 秘籍残篇 2 | 3 | > Those who bear true belief in flxg shall fear no malbolge! 4 | > 5 | > -- La Divina FLXG Commedia 6 | 7 | FLXG 创始人 CWK 修为通玄, 万古罕有. 至今无敢直呼其名者, 皆以西文缩写代之. 8 | 9 | 据 *神 FLXG 曲* 载, CWK 为探 FLXG 之密, 曾 *排空驭气奔如电, 升天入地求之遍. 上穷碧落下尽黄泉, 两处茫茫而无可见.* 后其闭关九年, 又仗三尺长剑, 携一刀生宣, 闯 *但丁* 旧时幽路. 平荆棘, 暴霜露, 惊恶魑, 斩狱卒, 神鬼莫可当之. 10 | 11 | 每其行足七千里也, 元气化墨, 即为箧囊所藏, 凝之一字, 现诸纸上. 及至伊甸园, 经义已成十万八千字余矣. 当是时, 人间科技正高速发展, 上帝不得已, 将 2D 天空贴纸更为 3D, 故而旧道不通. CWK 举目四望, 但见群星闪烁. 扪参历井, 方知穷途将归. 12 | 13 | 归来后, 宣纸已自编纂成册, 即 *神 FLXG 曲* (曾藏于滑稽大学博物院, 现已佚失). 其中记载 CWK 种种经历此处且按下不提. 而 *[Inferno: Malebolge](https://en.wikipedia.org/wiki/Malebolge)* 一章, 以 [Malbolge](https://en.wikipedia.org/wiki/Malbolge) 语言书成. 虽晦涩难通, 所谓佶屈而聱牙, 然真义无穷, 实乃无上之道法. 14 | 15 | 江湖余此残篇, 而今公示于天下. 可否有所体悟, 且看诸君之造化. 16 | 17 | [打开题目](src/malbolge.txt) 18 | 19 | --- 20 | ### 滑稽 Art 21 | ##### TL;DR 22 | 质因数分解,添加换行符,缩小字体 23 | ##### 详解 24 | Malbolge 语言是会忽略空格的,可是为什么 txt 里面有这么多空格呢? 25 | 26 | 用文本编辑器打开发现,这些字符好像有些规律。调小字体大小后发现有明显的 pattern。 27 | 28 | 用浏览器打开(firefox 和 chrome 都行,黑曜石也行),调到合适的字体大小,再手动调整宽度,可以看到一个畸变的图案,不过不影响做题,仍然可以读出 flxg。很多人提交记录里面把大写 U 看成小写,估计都是用这种方法做的。 29 | 30 | 当然官方解法肯定不是这么做的。 31 | 32 | 使用 wc 命令统计一下字符数,发现一共有 154012 个字节。我们应该可以猜到这个文件是个字符画,但是换行被去掉了所以变得很难看。使用 factor 或者 yafu 对这个数进行质因数分解,发现 154012 = 2 * 2 * 139 * 277。经验上,等宽字体字符画像素上的长宽比和字符数的长宽比大致在 1 : 2 左右。所以我们猜测,这个字符画的长宽大概是 556 * 277 或者 574 * 278。 33 | 34 | 使用 python 或其他语言,每隔这么多字符打印一次 '\n',在控制台上能看到非常正宗的滑稽图案。flxg 赫然醒目。 35 | ### 天书易解 36 | ##### TL;DR 37 | https://www.matthias-ernst.eu/malbolgereverse.html 38 | ##### 详解 39 | 其实这道题主要考察选手 Google 能力..。 40 | 41 | 从出题人的角度,如果要出一道 Malbolge 逆向,出题人会怎么写代码。 42 | 43 | 其实这道题的关键就在于弄清楚条件判断是如何实现的。Malbolge 语言没有条件跳转语句,所以只能通过跳转表模拟。弄清楚这一点的话剩下的就是时间问题了。 44 | 45 | 所以通过搜索,能找到 Cat halts on EOF 这个程序的源码。甚至可以找到 https://github.com/zb3/malbolge-tools/blob/master/samples/src/q.hell 。 46 | 47 | 通过 HELL IDE 反汇编,可以看到这份代码与本题之间的相似程度非常之高。实际上,许多 Malbolge 程序处理 if 判断的方法基本都是同一份代码。 48 | 49 | 确定本题是由 HELL IDE 编译的又一方法是观察代码的前几个字节。HELL IDE 在编译的时候会增加一些初始化的代码,相当于给内存分成代码区和数据区。仔细与其他程序比较可以看到明显的共同点。 50 | 51 | 另一种预期做法,污点分析。 52 | 53 | 可以注意到键盘的输入会相互 ROT 和 CRZ,最终形成一个 Ternary byte,之后的处理就全部基于这个字节上进行,输入数据的其他信息都丢失。所以可以对这个字节进行爆破,自己写好调试器之后十分简单。 54 | 55 | (此处省略爆破代码) 56 | 57 | 做出来题目的同学并不期望能拿到 Key,因为这是一个多对一的压缩过程。这里给一个可行的 Key: ./;'[]-=0 58 | 本题 HELL 源代码见 flxg.hell 文件。 59 | -------------------------------------------------------------------------------- /official/true_flxger/images/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/true_flxger/images/.gitkeep -------------------------------------------------------------------------------- /official/true_flxger/src/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/true_flxger/src/.gitkeep -------------------------------------------------------------------------------- /official/ustcquiz/README.md: -------------------------------------------------------------------------------- 1 | # 猫咪问答 2 | 3 | 铲屎官:要铲屎吗?**@猫咪** 4 | 5 | 猫咪:我是你直接@的?你这是在叫主子?我不想看见第二次。 6 | 7 | 猫咪:喵的心里没点数? 8 | 9 | 一只路过的狗:请各位铲屎官注意自己的身份和说话方式。**@全体成员** 10 | 11 | 为了不被骂,铲屎官再也不敢问任何问题了,下面这些简单的问题,也只能你自己来搜索解决。 12 | 13 | [打开题目](http://202.38.95.46:12007/) 14 | 15 | --- 16 | 17 | 欢迎来到猫咪系列题目之**猫咪问答**。 18 | 19 | 这道题是一道非常简单的题目,主要是想让同学们学会一些搜索技巧。 20 | 21 | ## 解法 22 | 23 | 下面我们来逐一分析: 24 | 25 | 1. 中国科学技术大学的建校年份是? 26 | 27 | 直接搜索即可; 28 | 29 | 2. 你研究过中国科大学号的演变史吗?现有一位 1992 年入学的博士生,系别为 11 系,学生编号为 26,请问 Ta 的学号是? 30 | 31 | 搜索“中国科大学号的演变史”,可以找到[中国科大的学号演变史](http://aga.ustc.edu.cn/site/ustc_xyh/xyh/cnt/?id=18185),按照 1958 级 - 1996 级的规则生成即可,注意题目中说的是博士生; 32 | 33 | 3. 视频《诺贝尔奖获得者和杰出科学家祝福科大60华诞》中,出现了多少位诺贝尔奖得主和世界顶尖科学家为中国科大六十周年华诞送上祝福?(数字) 34 | 35 | 直接搜索“诺贝尔奖获得者和杰出科学家祝福科大60华诞”观看视频即可;也可以选择不看,直接爆破 0~100(合理估计); 36 | 37 | 4. 在中国科大图书馆中,有一本书叫做《程序员的自我修养:链接、装载与库》,请问它的索书号是? 38 | 39 | 打开[中国科大图书馆主页](https://lib.ustc.edu.cn/),直接搜索“程序员的自我修养”即可。 40 | 41 | 5. 我校 Linux 用户协会在大约三年前曾经举办过一次小聚,其主题是《白帽子大赛,黑客不神秘》,请问这次小聚使用的教室编号是? 42 | 43 | 直接搜索“白帽子大赛,黑客不神秘”即可,可以找到若干年前 Google Groups 上的[活动公告](https://groups.google.com/forum/#!topic/ustc_lug/356R2-WRaI0)。 44 | 45 | zzh 补充:加引号搜索或者加上 LUG 等关键词,也可以在 [LUG活动](https://lug.ustc.edu.cn/wiki/lug/events/start) 上找到答案 46 | 47 | 最后得到 flag:`flag{G00G1E-is-always-YOUR-FRIEND}` 48 | -------------------------------------------------------------------------------- /official/ustcquiz/images/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/ustcquiz/images/.gitkeep -------------------------------------------------------------------------------- /official/ustcquiz/src/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ustclug/hackergame2018-writeups/8f1988b4182335af751e147fd7eae1fcc5206341/official/ustcquiz/src/.gitkeep -------------------------------------------------------------------------------- /official/ustcquiz/src/ustcquiz/app/index.php: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 |答对了 $cnt 道题
"; 28 | if ($cnt === count($questions)){ 29 | echo $flag; 30 | } 31 | } 32 | ?> 33 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /official/ustcquiz/src/ustcquiz/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | services: 3 | php: 4 | build: 5 | context: ./services/php 6 | dockerfile: Dockerfile 7 | volumes: 8 | - ./app:/mnt/app 9 | restart: always 10 | web: 11 | image: nginx:1.11.1 12 | ports: 13 | - "12007:80" 14 | depends_on: 15 | - php 16 | volumes_from: 17 | - php 18 | volumes: 19 | - ./images/nginx/config:/etc/nginx/conf.d 20 | restart: always 21 | -------------------------------------------------------------------------------- /official/ustcquiz/src/ustcquiz/images/nginx/config/default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name localhost; 4 | root /mnt/app; 5 | index index.php index.html index.htm; 6 | 7 | location / { 8 | } 9 | 10 | location ~ \.php$ { 11 | fastcgi_pass php:9000; 12 | fastcgi_index index.php; 13 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 14 | include fastcgi_params; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /official/ustcquiz/src/ustcquiz/services/php/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:5.6-fpm 2 | MAINTAINER ustchjyYes, I finally realized that I am a teapot!
19 |This is my gift for you:
20 |{0}
21 |Come to This Link, help me brew some tea, and you can get the 2nd FLAG!
""".format(flag, url_for("brew")) 22 | elif "coffee" in user_input_name: 23 | return """ 24 |
You said COFFEE? You sure?
25 |Maybe you should find someone else to brew coffee for you.
26 | """ 27 | else: 28 | return """ 29 |I am not really sure whether your answer is right.
30 |You should probably try again.
31 | """ 32 | except (KeyError, AttributeError) as _: 33 | return """ 34 |You know what?
35 |Hacking this page WON'T help.
36 |After all, I am NOT written in the "best language in the world".
37 | """ 38 | 39 | @app.route(brew_url, methods=["POST", "BREW", "GET", "WHEN"]) 40 | @app.route(brew_url + 'The method "POST" is deprecated.
45 |See RFC-7168 for more information.
46 | """ 47 | elif request.method == 'GET': 48 | return """ 49 |Brewing tea is not so easy.
50 |Try using other methods to request this page.
51 | """ 52 | elif request.method == "WHEN": 53 | return """ 54 |I'm NOT a coffee pot.
55 |Please, read RFC-7168, not RFC-2324.
56 | """, 418 57 | try: 58 | header_content_type = request.headers["Content-Type"] 59 | if header_content_type == "message/coffeepot": 60 | return """ 61 |Don't you remember what's in the 1st FLAG?
62 | """, 418 63 | if header_content_type != "message/teapot": 64 | return """ 65 |According to your header, it seems that you are not requesting for tea.
66 |Stop.
67 | """ 68 | if tea_type == "black_tea": 69 | return "Here is your tea: {}".format(flag2) 70 | elif tea_type != None: 71 | return """ 72 |Sorry, but this teapot doesn't support tea {}
73 | """.format(tea_type) 74 | else: 75 | resp = make_response("Supported tea type:") 76 | resp.headers["Alternates"] = '{{"{0}" {{type message/teapot}}}}'.format(brew_url + "black_tea") 77 | return resp, 300 78 | 79 | except KeyError: 80 | return """ 81 |
Please check if there is anything missing in your header.
82 | """ 83 | 84 | 85 | if __name__ == '__main__': 86 | app.run('0.0.0.0', 5001, threaded=True) 87 | 88 | 89 | -------------------------------------------------------------------------------- /official/who_am_i/src/who_am_i/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | web: 4 | build: . 5 | ports: 6 | - "12005:5001" 7 | restart: always 8 | -------------------------------------------------------------------------------- /official/who_am_i/src/who_am_i/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |「我是谁?」
18 |「我从哪里来?」
19 |「将到哪里去?」
20 |据说有这样三个有趣的哲学问题。
21 |现在,请帮我回答第一个问题吧。
22 |