签到题
见此 https://www.cnblogs.com/BUGCAT/p/17781082.html
[Baby]babyphp
flag1
对于flag1,只有传入的a和b的值不相等,而且SHA1加密后的值相同才会出现flag
php对数组进行sha1加密都为false,所以我们传入两个数组进去
http://101.35.209.40:2003/?a[]=1&b[]=2
flag2
代码中给提示说要 cat /flag
,那就是要将 Yu 赋值为 exec('cat /flag');
但是!这种肯定不是暴力碰撞出来的(,所以只能找工具生成
看到工具生成的两个文件后面有乱码,为了不影响代码就可以在 exec(‘cat /flag’); 加上 ?> 来终止 php 的执行
这里有几个要注意的点(卡了好久):
工具生成的文件中会有Hex值为 00 的字符,如果是直接复制粘贴文件内容然后到 url 处输出就错了,首先 00 会变 20 (空格),还有一些乱码也可能会被错误识别,正确的做法是直接将文件中的内容拿去 url 编码,然后贴在 url 里面就OK了(这里直接用Burp一条龙处理就OK)
exec('cat /flag'); } ?>
这种其实是错误的,是不需要花括号的,我本来以为 eval() 函数是一个直接代码替换,虽然说可以这么理解,但是编译器会首先检查 eval() 中的字符串是否是可执行的代码,是的话才能替换,所以如果加了花括号,就会报错,因为缺少了匹配的花括号( eval() 函数内的代码字符配对和函数外的完全无关 )
最后有个最难受的,就是 exec(‘cat /flag’); 这条指令,cat 虽然是输出用的,但是这里要输出到一个文件或变量中去,就要改为 exec(‘cat /flag’,$outp); ,这样就会将执行结果输入到 $outp 这个变量里,最后再输出就行了,所以要传入的代码是这样的
exec('cat /flag',$outp);
print_r($outp);
?>
【[Baby]babyphp】 全部解决
[Baby]babyunserialize
flag1
对于flag1,观察代码可知会将 POST 数据中的 auth 反序列化,然后判断其中的值,那么只要创建有对应值的数组(类好像没法反序列话) auth,然后 POST 传入就行
!!注意传 POST 时 Content-Type 这行要加
[Easy]♪绝♩对♫音♬感♪
这道题做做停停,终于搞出来了
下载音频,看看波形图,好像没什么东西
用 Winhex 或类似软件打开,看看头和尾,末尾有这么一句话
The interval of each byte data is 9 and the first byte is at the beginning of the wav data
每隔九个,我把编辑器设置一下
这样就比较好看,如果有隐藏信息的话就是一排下来
然后就可以翻到这个东西,看起来像一封邮件,和题干里说的一样
但是没有找到三体((,接下来就不会做的了
闲的时候水水群,看到这么一段聊天(
原来题干里有提示,赶紧重新仔细看一下题干,邮件特别标注了英文名 Spam ,网上搜搜,有惊喜发现
还得是群里的佬
然后就尝试把文本里的邮件给抽出来
一开始脑抽了,一个一个对照然后打在记事本里,结果就是打了一堆小错误,换行也没有注意
检查半天解码后得到的是乱码,直接放弃人工赛道了,不如自己写个 C++ 程序提取
相当简单,没十五分钟就提取出来了(16进制编码)(我前面到底在干什么
然后把编码去解码一下就得到邮件的文本了,再去 spam mimic 网站解码一下就得到 flag 了
[Easy]♪绝♩对♫音♬感♪ 解决
[Middle]马赛克星球
恢复图片了!
下载附件,发现图片很大,23.1M,但是分辨率只有 648*328 (这数字一看就是故意搞的()),所以我们可能要修改一下图片的尺寸
STFW
CTF Misc(1)图片隐写基础以及原理,覆盖了大部分题型
所以来进行CRC爆破
用hex打开图片看看
import os
import binascii
import struct
crcbp = open("D:\pythonProject\Recycle.png", "rb").read() #打开图片
# print(crcbp)
for i in range(10000):
for j in range(10000):
data = crcbp[12:16] + \
struct.pack('>i', i)+struct.pack('>i', j)+crcbp[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
if(crc32 == 0x8990B635): #图片当前CRC
print(i, j)
print('hex:', hex(i), hex(j))
break
爆破后可以得到图片的分辨率为 3000*4200 ,在hex中进行修改,可以得到完整图片,下面附有flag
找到隐藏的信息了!
继续看看hex,发现最后有一段python代码
from PIL import Image
import math
import random
final_image = Image.open("base.png")
flag_image = Image.open("flag.png")
final_image_width = final_image.width
final_image_height = final_image.height
flag_image_width = flag_image.width
flag_image_height = 156
prime_li = []
c_li = []
if __name__ == '__main__':
a = 0
c = 0
while 1:
a += 1
if is_prime(a):
prime_li.append(a)
c += 1
if c > flag_image_width * flag_image_height:
break
for i in range(0, len(prime_li) - 1):
value = (prime_li[i] + prime_li[i + 1]) * (prime_li[i + 1] - prime_li[i])
if value in c_li:
while value in c_li:
value -= i
c_li.append(value)
k = 0
for num in c_li:
try:
final_image.putpixel(
(num % final_image_width, int(num / final_image_width)),
flag_image.getpixel((k % flag_image_width, int(k / flag_image_width))),
)
k += 1
except:
print(f"The num: {num} is too big")
for yy in range(0, final_image_height):
for xx in range(0, final_image_width):
if (yy * final_image_width + xx) not in c_li:
final_image.putpixel(
(xx, yy),
(
random.randint(0, 255),
random.randint(0, 255),
random.randint(0, 255),
),
)
final_image.save("mosaic.png")
仔细读了一下,发现是把flag的图片写入给的图片,然后其他的地方就随机生成色块
我们就可以依照上面,试着写出解密的代码
import math
from PIL import Image
shai = []
prime_li = []
c_li = []
final_image = Image.open("Recycle(2).png")
flag_image = Image.open("flag.png")
final_image_width = final_image.width
final_image_height = final_image.height
flag_image_width = flag_image.width
flag_image_height = 156
# Total = 500000000
#
# shai = [True] * (Total+1)
# shai[0] = shai[1] = False
# for i in range(2,int(math.sqrt(Total+1))):
# if shai[i]:
# for j in range(i*i, int(math.sqrt(Total+1)), i):
# shai[j] = False
#
# print("Part 1 Finish")
# print(Total)
#
# def is_prime(x):
# if x < 0:
# return False
# return shai[x]
# 一开始写了一段埃筛发现不好判断筛的范围,可能会跑很久()
def is_prime(x):
if x <= 1:
return False
for i in range(2, int(math.sqrt(x)+1) ):
if x % i == 0:
return False
return True
if __name__ == '__main__':
a = 0
c = 0
while 1:
a += 1
if is_prime(a):
prime_li.append(a)
# print(f"qwq {a}")
c += 1
if c > flag_image_width * flag_image_height:
break
for i in range(0, len(prime_li) - 1):
value = (prime_li[i] + prime_li[i + 1]) * (prime_li[i + 1] - prime_li[i])
if value in c_li:
while value in c_li:
value -= i
c_li.append(value)
# print(f"qwq {value} {len(c_li)} {len(prime_li)}")
print(len(c_li))
k = 0
for num in c_li:
try:
flag_image.putpixel(
(k % flag_image_width, int(k / flag_image_width)),
final_image.getpixel((num % final_image_width, int(num / final_image_width))),
)
k += 1
except:
print(f"The num: {num} is too big")
break
flag_image.save("mosaic.png")
这里的 Recycle(2) 就是上面那张图片中间的乱像素点,要把它截出来,这个比较考验技术力和耐心((
现在就只需要看看 flag_image.width 定多大合适
经过多次尝试,以及翻了Akejyo大佬的blog(
得知定 38 刚好不会报 “The num: {num} is too big”
然后就得到
看起来挺有规律的一张图(至少不是乱码),STFW,试试用 npiet 解一下
[Middle]马赛克星球 解决