最近我們公佈了本次Q2的比賽成績,戳:【英雄榜單】看雪.紐盾 KCTF 晉級賽Q2 排行榜出爐!恭喜獲獎的選手們!
目前我們正在對賽題進行逐一講解,比賽期間沒有做出來的小夥伴們也不要灰心,請持續關注我們,或許點評與解析會讓你茅塞頓開哦!
今天我們將繼續對第五題《叢林的祕密》進行題目點評與解析。
題目簡介
題目背景:
鬱鬱蔥蔥都樹林之後,是一隻只光亮的眼睛。
外星人的活力集中在亞歐大陸上,位於南美洲的亞馬遜森林,此時彷彿是世外桃源。陽光通過高聳的樹木,散落下來,灑在滿地的落葉上。行走在其中,彷彿進入了一場大型動物博覽會,天上飛的、樹上爬的、地上走的、水裡遊的,應有盡有,看的人眼花繚亂。不知不覺走了很遠,卻仍然困在這個森林中。一不小心,你落入了一個深不見底的深坑中,身體不斷的陷入黑暗,下沉、下沉、下沉......突然一束刺眼的光閃入你的眼睛,那是能量寶石!可是能量寶石在深坑的底部,無論你如何的向下墜落,似乎都無法到達底部......
本題共有2057人圍觀,最終有35支團隊攻破成功。
攻破此題的戰隊排名一覽:
接下來讓我們一起看看這道題究竟有何玄妙之處吧!
看雪評委crownless點評
這道題的難度初級,主要邏輯在WebAssembly中,只要儲存下來用wasm2c反編譯成c程式碼,即可獲取flag。
設計思路
本題出題戰隊F_T簡介:
個人簡介:foyog,付震,北京郵電大學移動網際網路安全技術國家工程實驗室研三學生,曾實習於騰訊移動安全實驗室,主要工作是對安卓核心進行fuzz測試和漏洞分析。現實習於360智慧安全研究院,從事自動化漏洞挖掘方向的工作。
賽題分析
參賽的題目是一個安卓的程式,由於安卓webview在4.4後開始使用chrome的核心,所以經過測試,安卓8.1及以上的webview版本是可以成功的執行webassembly的。(低版本沒有測,該題目不能保證在低版本下成功執行)。
故使用webassembly作為出題的依據,由於無法像桌面版的chrome那樣直接動態除錯webassembly,解題者需要講安卓程式上的html網頁轉移至桌面版即可動態除錯。但由於webassembly的位元組碼不同於x86,需要解題者對webassembly的位元組碼進行研究才能解題。
主要演算法
首先html網頁如下:
安卓程式中將main.wasm直接作為二進位制的字串放在了html中,但是解題流程不變化。
html中呼叫了wasm中的check_flag函式進行驗證。
wasm的原始碼(由於原始碼過長,請點選閱讀原文在原帖下載)
最根本的演算法就是一個32*32的線性方程組,函式為xxx(),而o,oo等八個函式只是簡單的做了一個異或運算,迷惑解題者。
線性方程組的A和b為:
b:
解題者需要利用指令碼檔案去讀取這些引數並求解。解為:
S0m3time_l1tt1e_c0de_1s_us3ful33
而由於o、oo等八個函式只是做異或運算,可以得到flag為:
K9nXu3_2o1q2_w3bassembly_r3vers3
安卓程式
只有一個activiy,其中最主要的是一個webview,通過loadurl(127.0.0.1:8000)來解析html。
但是程式中還寫了一個textview,一個button和一個edittext來迷惑解題者。
主要程式碼:
native的函式主要工作為,實現一個簡單的http伺服器,內容為上面的wasm程式碼。
程式碼請見文末左下角閱讀原文。
解題思路
本題解題思路由看雪論壇風間仁提供:
這個是Web頁面,url:http://127.0.0.1:8000。
public class MainActivity extends AppCompatActivity {
private Button button1;
private EditText eText1;
private TextView txView1;
public String url;
static {
System.loadLibrary("gogogo");
}
public MainActivity() {
this.url = gogogoJNI.sayHello();
}
protected void onCreate(Bundle arg3) {
...
this.findViewById(2131165318).loadUrl(this.url);
this.findViewById(2131165318).getSettings().setJavaScriptEnabled(true);
...
}
}
jstring __fastcall Java_com_example_assemgogogo_gogogoJNI_sayHello(JNIEnv *a1)
{
//http://127.0.0.1:8000
for ( i = 0; i != 21; ++i )
url[i] = byte_2D28[i] ^ 0x66;
url[21] = 0;
return (*v2)->NewStringUTF(v2, url);
}
在JNI_OnLoad中監聽8000埠,傳送html頁面。
.text:00000D1A ADD R1, PC ; "8000"
...
.text:00000D26 BLX getaddrinfo
.text:00000C50 ADD R0, PC ; "HTTP/1.1 200 OK\r\nContent-Type: text/h"...
...
.text:00000C60 BLX accept
...
.text:00000CA6 BLX send
html頁面:
<html>
<script>
var instance;
WebAssembly.compile(new Uint8Array(`
...
`.trim().split(/[\s\r\n]+/g).map(str => parseInt(str, 16))
)).then(module => {
new WebAssembly.instantiate(module).then(results => {
instance = results;
}).catch(console.error);})
function check_flag(){
var value = document.getElementById("key_value").value;
if(value.length != 32)
{
document.getElementById("tips").innerHTML = "Not Correct!";
return;
}
instance.exports.set_input_flag_len(value.length);
for(var ii=0;ii<value.length;ii++){
instance.exports.set_input_flag(value[ii].charCodeAt(),ii);
}
var ret = instance.exports.check_key();
if (ret == 1){
document.getElementById("tips").innerHTML = "Congratulations!"
}
else{
document.getElementById("tips").innerHTML = "Not Correct!"
}
}
</script>
<body>
<div>Key: <input id="key_value" type="text" name="key" style="width:60%" ;="" value=""> <input type="submit" value="check" onclick="check_flag()"></div>
</body></html>
主要邏輯在WebAssembly中,儲存下來用wasm2c反編譯成c程式碼:
https://github.com/WebAssembly/wabt
./wasm2c test.wasm -o test.c
將程式碼摳出來,z3解得sn:K9nXu3_2o1q2_w3bassembly_r3vers3。
精彩回顧:
1、看雪.紐盾 KCTF 2019 Q2 | 第一題點評及解題思路
2、看雪.紐盾 KCTF 2019 Q2 | 第三題點評及解題思路
3、看雪.紐盾 KCTF 2019 Q2 | 第二題點評及解題思路
4、看雪.紐盾 KCTF 2019 Q2 | 第四題點評及解題思路
5、【英雄榜單】看雪.紐盾 KCTF 晉級賽Q2 排行榜出爐!
主辦方
看雪學院(http://www.kanxue.com)是一個專注於PC、移動、智慧裝置安全研究及逆向工程的開發者社群!建立於2000年,歷經19年的發展,受到業內的廣泛認同,在行業中樹立了令人尊敬的專業形象。平臺為會員提供安全知識的線上課程教學,同時為企業提供智慧裝置安全相關產品和服務。
合作伙伴
上海紐盾科技股份有限公司(http://www.newdon.net)成立於2009年,是一家以“網路安全”為主軸,以“科技源自生活,紐盾服務社會”為核心經營理念,以網路安全產品的研發、生產、銷售、售後服務與相關安全服務為一體的專業安全公司,致力於為數字化時代背景下的使用者提供安全產品、安全服務以及等級保護等安全解決方案。
小手一戳,瞭解更多
釋出於 08:57