NepCTF2023--部分wp

文章介绍了NepCTF2023中的一个编程挑战,涉及Huffman编码的使用,包括压缩和解压缩数据,以及解码包含Morse码和十六进制的隐藏信息。还提到了与安全漏洞相关的pwn和CVE问题的解决过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NepCTF2023–部分wp

在这里插入图片描述

Misc:

Check in

NepCTF{H4ve_Fun_1N_This_Game}

与AI共舞的哈夫曼

需要在原本附件里自带的py文件修改一下即可

import heapq
import os

class HuffmanNode:
  def __init__(self, char, freq):
    self.char = char
    self.freq = freq
    self.left = None
    self.right = None

  def __lt__(self, other):
    return self.freq < other.freq

def build_huffman_tree(frequencies):
  heap = [HuffmanNode(char, freq) for char, freq in frequencies.items()]
  heapq.heapify(heap)

  while len(heap) > 1:
    left = heapq.heappop(heap)
    right = heapq.heappop(heap)
    merged = HuffmanNode(None, left.freq + right.freq)
    merged.left = left
    merged.right = right
    heapq.heappush(heap, merged)

  return heap[0]

def build_huffman_codes(node, current_code, huffman_codes):
  if node is None:
    return

  if node.char is not None:
    huffman_codes[node.char] = current_code
    return

  build_huffman_codes(node.left, current_code + '0', huffman_codes)
  build_huffman_codes(node.right, current_code + '1', huffman_codes)

def compress(input_file, output_file):
  with open(input_file, 'rb') as f:
    data = f.read()

  frequencies = {}
  for byte in data:
    if byte not in frequencies:
      frequencies[byte] = 0
    frequencies[byte] += 1

  root = build_huffman_tree(frequencies)
  huffman_codes = {}
  build_huffman_codes(root, '', huffman_codes)

  compressed_data = ''
  for byte in data:
    compressed_data += huffman_codes[byte]

  padding = 8 - len(compressed_data) % 8
  compressed_data += '0' * padding

  with open(output_file, 'wb') as f:
    \# Write frequency information
    f.write(bytes([len(frequencies)]))
    for byte, freq in frequencies.items():
      f.write(bytes([byte, (freq >> 24) & 0xFF, (freq >> 16) & 0xFF, (freq >> 8) & 0xFF, freq & 0xFF]))

​    \# Write compressed data
​    for i in range(0, len(compressed_data), 8):
​      byte = compressed_data[i:i+8]
​      f.write(bytes([int(byte, 2)]))


def build_huffman_tree_from_bytes(frequencies):
  heap = [HuffmanNode(byte, freq) for byte, freq in frequencies.items()]
  heapq.heapify(heap)

  while len(heap) > 1:
    left = heapq.heappop(heap)
    right = heapq.heappop(heap)
    merged = HuffmanNode(None, left.freq + right.freq)
    merged.left = left
    merged.right = right
    heapq.heappush(heap, merged)

  return heap[0]

def decompress(input_file, output_file):
  with open(input_file, 'rb') as f:
    frequencies_count = ord(f.read(1))
    frequencies = {}for _ in range(frequencies_count):
​      byte = ord(f.read(1))
​      freq = (ord(f.read(1)) << 24) + (ord(f.read(1)) << 16) + (ord(f.read(1)) << 8) + ord(f.read(1))
​      frequencies[byte] = freq

​    root = build_huffman_tree_from_bytes(frequencies)

​    huffman_codes = {}
​    build_huffman_codes(root, '', huffman_codes)
​    reverse_huffman_codes = {v: k for k, v in huffman_codes.items()}

​    decompressed_data = bytearray()
​    code = ''while True:
​      byte = f.read(1)if len(byte) == 0:break

​      byte = ord(byte)for i in range(7, -1, -1):if byte & (1 << i):
​          code += '1'else:
​          code += '0'if code in reverse_huffman_codes:
​          decompressed_data.append(reverse_huffman_codes[code])
​          code = ''

  with open(output_file, 'wb') as f:
    f.write(decompressed_data)


if __name__ == "__main__":
  \# input_file = 'input.txt'
  compressed_file = 'compressed.bin'
  decompressed_file = 'decompressed.txt'

  \# 压缩文件
  \# compress(input_file, compressed_file)

  \# 解压缩文件
  decompress(compressed_file, decompressed_file)

小叮弹钢琴

下载拿到piano.bin,是个音频文件,拉进Audacity看一下,发现有频谱,通过放大缩小频谱发现有字符串,将字符串抄写下来,钱一部分是摩斯密码,后部分是16进制

1011 111 001 000 0000 111 001 0100 100 001 000 0 1 0000 00 000 1 111 1001 111 010 000 111 11 0 1 0000 00 10 110

0x370a05303c290e045005031c2b1858473a5f052117032c39230f005d1e17

对摩斯面解码发现:

image-20230812145240478

YOUSHOULDUSETHISTOXORSOMETHING

提示应该有异或,但暂时不知道是什么,

后来试了半天与16进制转字符串异或

image-20230814161353554

codes

#include <stdio.h>

extern char **en\
viron;
int main()
{
    int i = 0;
    while (en\
viron[i] != NULL)
    {
        printf("%s\n", en\
viron[i]);
        i++;
    }
    return 0;
}

陌生的语言

打开图片一脸懵,发现有特殊符号,题目描述说

A同学在回学校的路上捡到了一张纸条,你能帮帮她吗?

flag格式:NepCTF{XX_XX}

hint:A同学的英文名为“Atsuko Kagari”

去搜Atsuko Kagari”,发现为小魔女学园动漫女主角,去看了动漫,发现里面有着文字,新月文字和古龙语,去上网找解释

找到

对应写出,按照感觉添加下划线

NepCTF{NEPNEP_A_BELIEVING_HEART_IS_YOUR_MAGIC}

ConnectedFive

这道题就是个游戏,就是自己和机器人下棋,你自己先先连出来42和5子棋就可得到flag,不想在复现一遍了。。。

web

ez_java_checkin

题目说是一种很老的cve,题目又是java-checkin,上网搜,找到一个跟java有关得cve

shiro550反序列化漏洞

利用工具

image-20230813164252615

image-20230813164322711

image-20230813164337799

得到flag

NepcTF{Ezjava_Chekin}

pwn

HRP-CHAT

HRP-CHAT-4

当时打boss给系统打崩了就进入到了安全模式但是很懵,本来看代码相出3的,就去看了一下safebox.c,发现这里面可以吐出来4flag
image-20230814152239315

输入Safe_Mode_Key即可得出flag

HRP-CHAT-3

看servc.c源码发现

image-20230814153345494
先抽奖抽出来H3h3QAQ,
在这里插入图片描述在这里插入图片描述他的技能伤害高,超过999999可以直接秒杀boss
在这里插入图片描述根据角色的下标,和技能下标打
在这里插入图片描述这里我的角色从0数是第4个,技能伤害高的是2技能,要输入4 1

打败boss,得到flag

打败bossT能够得到flag

问卷调查

NepCTF{See_you_in_NepCTF2024}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q1ng_chuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值