2025H&NCTF-Misc&取证&OSINT全解

Misc

签到&签退

公众号发送信息获取flag

问卷

回答问卷得flag

芙宁娜的图片

随波逐流扫一下图片,在RGB通道发现key

key:H&N2025

看txt

+++++ +++[- >++++ ++++< ]>+++ +++++ +++++ ++.<+ +++++ [->-- ----< ]>--- --.<+ +++++ [->++ ++++< ]>+++ +.++. ++++. <+++[ ->--- <]>-- ---.< +++++ ++[-> +++++ ++<]> ++++. <++++ +[->- ----< ]>--- ----- -.<++ ++++[ ->--- ---<] >---- -.<++ +++++ +[->+ +++++ ++<]> +++++ .<+++ +[->- ---<] >---- --.<+ ++++[ ->+++ ++<]> +.<++ ++[-> ----< ]>--- -.<++ +[->+ ++<]> ++.-. ----- ---.+ +++++ +.--- --.<+ +++[- >++++ <]>+. <++++ [->-- --<]> ----- .<+++ [->++ +<]>+ ++.<+ +++[- >---- <]>-- .<+++ +[->+ +++<] >++++ +.<++ +[->- --<]> ---.- --.-- ----. <++++ +[->- ----< ]>--- .<+++ +++[- >++++ ++<]> +++++ +++.+ +++++ .---- -.--- ----- .<+++ [->++ +<]>+ +++.< +++++ +++[- >---- ----< ]>--- ----- ----- -.<++ +++++ +[->+ +++++ ++<]> +++++ +++++ ++.<+ +++[- >---- <]>-- --.<+ +++[- >++++ <]>+. +++.- ---.- ----- --.<+ +++++ +[->- ----- -<]>- ----- --.<+ +++++ ++[-> +++++ +++<] >++++ +++++ +++++ +.<

brainfuck解密

O&NPTF{Y0u_yepognizeq_the_Couphu's_psog.}

维吉尼亚解密

H&NCTF{Y0u_recognised_the_Chuchu's_plot.}

星辉骑士

解压docx文件

在星辉骑士\word\media目录下找到flag.zip文件,解压出来

垃圾邮件解密

https://www.spammimic.com/

999.txt为flag

H&NCTF{0231265452-you-kn*w-spanmimic}

乱成一锅粥了

下载流量包,导出所有zip

对zip中的txt文件名字进行解密

经过几个尝试发现命名规则为01-50每个数的MD5加密

我重新还原原本的txt序列名称

import os
import hashlib def generate_md5_dict():
"""生成数字01-50到其MD5值的映射字典"""
md5_dict = {}
for i in range(1, 51):
# 格式化为两位数,前面补零
num_str = f"{i:02d}"
# 计算MD5值
md5_hash = hashlib.md5(num_str.encode('utf-8')).hexdigest()
md5_dict[md5_hash] = num_str
return md5_dict def rename_files(folder_path):
"""重命名文件从MD5值回数字"""
md5_dict = generate_md5_dict() # 遍历文件夹中的所有文件
for filename in os.listdir(folder_path):
if filename.endswith('.txt'):
# 去掉.txt后缀获取MD5部分
md5_part = os.path.splitext(filename)[0] if md5_part in md5_dict:
original_num = md5_dict[md5_part]
new_filename = f"{original_num}.txt"
old_path = os.path.join(folder_path, filename)
new_path = os.path.join(folder_path, new_filename) # 重命名文件
os.rename(old_path, new_path)
print(f"重命名: {filename} -> {new_filename}")
else:
print(f"跳过: {filename} (未找到对应的数字)") # 使用示例
folder_path = "" # 替换为你的文件夹路径
rename_files(folder_path)

发现为iV开头的base64,即png图片的base64的形式

继续还原

import os
import base64 def read_and_combine_txt_to_image(folder_path, output_image_path):
# 初始化空字符串用于存储拼接内容
combined_content = "" # 按顺序读取01.txt到50.txt
for i in range(1, 51):
# 生成文件名,保证两位数字格式
filename = f"{i:02d}.txt"
file_path = os.path.join(folder_path, filename) try:
with open(file_path, 'r', encoding='utf-8') as file:
combined_content += file.read()
except FileNotFoundError:
print(f"警告: 文件 {filename} 未找到,已跳过")
except Exception as e:
print(f"读取文件 {filename} 时出错: {str(e)}") if not combined_content:
print("错误: 没有读取到任何文件内容")
return False try:
# 将拼接后的内容解码为二进制数据
image_data = base64.b64decode(combined_content) # 将二进制数据写入图片文件
with open(output_image_path, 'wb') as image_file:
image_file.write(image_data) print(f"成功将拼接内容转换为图片并保存到: {output_image_path}")
return True
except base64.binascii.Error:
print("错误: 拼接的内容不是有效的Base64编码")
except Exception as e:
print(f"转换或保存图片时出错: {str(e)}") return False # 使用示例
folder_path = "" # 替换为你的txt文件所在文件夹路径
output_image_path = "output_image.png" # 输出的图片路径 read_and_combine_txt_to_image(folder_path, output_image_path)

得到二维码碎片

拼个图片扫码即可

H&NCTF{This_wont_be_difficult_for_you}

谁动了黑线?

查看csv

最后一列tx_hash是base58,解密一下

import csv
import base58 def decode_and_replace_base58_in_csv(csv_file_path, output_file_path=None):
"""
读取CSV文件,对最后一列(除第一行外)进行Base58解密,并用解密结果替换原始数据 参数:
csv_file_path (str): 原始CSV文件路径
output_file_path (str): 输出文件路径(如果为None则覆盖原文件) 返回:
list: 包含所有行的列表,每行最后一列已被解密(如果成功)
"""
all_rows = [] try:
with open(csv_file_path, mode='r', encoding='utf-8') as file:
reader = csv.reader(file) # 读取标题行
headers = next(reader, None)
if headers is not None:
all_rows.append(headers) for row in reader:
if not row: # 跳过空行
continue original_value = row[-1].strip() # 获取最后一列数据并去除空白 try:
# 尝试Base58解码
decoded = base58.b58decode(original_value).decode('utf-8')
row[-1] = decoded # 用解密结果替换原始数据
print(f"行 {reader.line_num}: 解密成功 {original_value} -> {decoded}")
except Exception as e:
print(f"行 {reader.line_num}: 解密失败 - {original_value} - 错误: {str(e)}")
# 解密失败则保留原始数据 all_rows.append(row) # 确定输出文件路径
output_path = output_file_path if output_file_path else csv_file_path # 写入更新后的数据
with open(output_path, mode='w', encoding='utf-8', newline='') as file:
writer = csv.writer(file)
writer.writerows(all_rows) print(f"\n文件已保存到: {output_path}") except FileNotFoundError:
print(f"错误: 文件 {csv_file_path} 未找到")
except Exception as e:
print(f"处理文件时发生错误: {str(e)}") return all_rows # 使用示例
if __name__ == "__main__":
# 替换为你的CSV文件路径
input_csv = "your_file.csv"
output_csv = "decoded_file.csv" # 设为None则会覆盖原文件 # 调用函数处理CSV文件
updated_data = decode_and_replace_base58_in_csv(input_csv, output_csv) # 打印前几行结果作为示例
print("\n前几行解密结果示例:")
for i, row in enumerate(updated_data[:5]):
print(f"行 {i+1}: {row}")

排序发现类似明文格式

我们编写代码,读取csv表的最后一列(除了第一行),读取第9位到第12位帮我把带有小写字母或者下划线_数据提取出来,最后全部拼起来

import csv

def process_csv(filename):
result = [] with open(filename, 'r', newline='', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile) # 跳过第一行(标题行)
next(reader, None) for row in reader:
if not row: # 跳过空行
continue # 获取最后一列
last_column = row[-1] # 检查长度是否足够
if len(last_column) >= 12:
# 提取第9到12位(Python中索引从0开始,所以是8:12)
substring = last_column[8:12] # 检查是否包含小写字母或下划线
if any(c.islower() or c == '_' for c in substring):
result.append(substring) # 将所有符合条件的子字符串拼接起来
final_string = ''.join(result)
return final_string # 使用示例
filename = 'decoded_file.csv' # 替换为你的CSV文件名
output = process_csv(filename)
print("拼接结果:", output) #拼接结果: little_dog_is_Aomr!!
H&NCTF{little_dog_is_Aomr!!}

Forensics

ez_game

下载镜像,火眼挂载

有个readme.txt

这次是个简单的取证小游戏
1.我藏了一个电脑,它的密码是很简单的弱密码,但是你找的到吗
2.图片没有隐写,但是它凭什么可以成为key,好难猜啊
3.如果你找的了flag,注意flag的内容全部大写

藏了一个电脑,我索引到一个hhh文件

有分别找到key.jpg和一个加密zip

全部导出

根据提示:图片没有隐写,但是它凭什么可以成为key

参考西湖论剑2025,图片可以作为密钥文件进行VC镜像挂载

我们挂载hhh文件

!

得到一个虚拟机

我们继续挂载vmdk

查看历史命令

有个hhh文件,且最近访问过

导出

010查看存在额外字符,猜测为零宽隐写

shift

类似上述历史命令

echo "key(shift):`1234567890-=" >> hhh.txt

根据提示1:密码是很简单的弱密码

题目给了

·123456789-=

通过shift反转得到

~!@#$%^&*()_+     //即为zip密码

解压之前得到的zip,得到flag.drawio文件

https://app.diagrams.net/

加载文件

H&NCTF{YOU_R_SSSO_COOL}

OSINT

Chasing Freedom 1

图片属性得到时间0503

图片定位到蓝眼泪观景台,开始对周围一通爆搜一个一个试

H&NCTF{0503-丁鼻垄}

Chasing Freedom 2

因为我是先写第3题,后写第二题的,发现时间差不多,而且是一个灯塔,那就试试去搜索东庠岛灯塔,还真找到一模一样的

H&NCTF{0504-东庠岛灯塔}

Chasing Freedom 3

拖进随波逐流找到时间

查看图片发现岚庠渡,去搜索

然后发现岚庠渡只有1,2,3号,去试试H&NCTF{0504-东庠码头-岚庠渡1号},全都试过了,发现不对,

H&NCTF{0504-流水码头-岚庠渡3号}

猜猜我在哪儿?

提示从太原出发到西安lm研发中心的路途

拍摄取景,应该是在高铁上

差不多定位到这

根据朝向,和四周地形进一步定位

试一下周围地点最终得到

flag{永济市张营镇下吴村}

2025H&NCTF-Misc&取证&OSINT全解的更多相关文章

  1. 第48章 MDK的编译过程及文件类型全解—零死角玩转STM32-F429系列

    第48章     MDK的编译过程及文件类型全解 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...

  2. 易全解token获取

    //易全解app             string strClientID = "2016061711434943493606";             string str ...

  3. IOS-UITextField-全解

    IOS-UITextField-全解   //初始化textfield并设置位置及大小   UITextField *text = [[UITextField alloc]initWithFrame: ...

  4. 什么是JavaScript闭包终极全解之一——基础概念

    本文转自:http://www.cnblogs.com/richaaaard/p/4755021.html 什么是JavaScript闭包终极全解之一——基础概念 “闭包是JavaScript的一大谜 ...

  5. Sql Server函数全解<五>之系统函数

    原文:Sql Server函数全解<五>之系统函数  系统信息包括当前使用的数据库名称,主机名,系统错误消息以及用户名称等内容.使用SQL SERVER中的系统函数可以在需要的时候获取这些 ...

  6. Sql Server函数全解<四>日期和时间函数

    原文:Sql Server函数全解<四>日期和时间函数   日期和时间函数主要用来处理日期和时间值,本篇主要介绍各种日期和时间函数的功能和用法,一般的日期函数除了使用date类型的参数外, ...

  7. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  8. js系列教程2-对象、构造函数、对象属性全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  9. js系列教程1-数组操作全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  10. css系列教程1-选择器全解

    全栈工程师开发手册 (作者:栾鹏) 一个demo学会css css系列教程1-选择器全解 css系列教程2-样式操作全解 css选择器全解: css选择器包括:基本选择器.属性选择器.伪类选择器.伪元 ...

随机推荐

  1. mac上 Kratos 配置 protoc

    前言 protoc 是 protobuf 文件(.proto)的编译器,可以借助这个工具把 .proto 文件转译成各种编程语言对应的源码,包含数据类型定义.调用接口等. protoc 在设计上把 p ...

  2. Redis 原理 - List

    List 数据结构 Redis 3.2 前,使用 压缩列表zipList 或 双向链表linkedList 当同时满足下面两个条件时,使用zipList存储数据 list保存的每个元素长度小于64字节 ...

  3. 从零开始开发一个 MCP Server!

    大家好!我是韩老师. 最近,在 AI 开发领域,MCP (Model Context Protocol) 是越来越火了! 前几天,我我也开发了一款 Code Runner MCP Server: Co ...

  4. c-primer-plus深入解读系列-从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜

    前言 小提示:阅读本篇内容,至少需要了解double和float的二进制表示规则. 书中的代码示例如下: #include <stdio.h> int main(void) { float ...

  5. 面试题-Storm框架

    前言 Storm框架在实际项目中已经平稳运行快一年了,也很好的支撑了海量读写器的数据处理需求,不过和RabbitMQ一样,为了项目进度,实际工作中只能尽快的调研,关注一些关键点,其他的细节就只能放一放 ...

  6. 【数据结构与算法】Java链表与递归:移除链表元素

    Java链表与递归:移除链表元素 Java https://leetcode-cn.com/problems/remove-linked-list-elements/solution/javalian ...

  7. volatile修饰全局变量,可以保证线程并发安全吗?

    今天被人问到volatile能不能保证并发安全? 呵,这能难倒我? 直接上代码: public class ThreadTest { // 使用volatile修饰变量 private static ...

  8. Nginx日志拆分(linux环境下)

    1.新增shell脚本[nginx_log.sh],进行每日自动切割一次,存储在nginx文件夹下的logs下 #!/bin/bash #设置日志文件存放目录 LOG_HOME="/app/ ...

  9. Golang服务可观测和思路分享

    省流 中医四诊"望闻问切"与程序诊断有异曲同工之妙.在Golang问题排查中,我们需要建立系统化的诊断思维:通过观察表象(望).收集信息(闻).追溯根源(问).精准施治(切)四个维 ...

  10. eolinker校验规则之正则匹配:返回结果校验的方法和案例(正则校验)

    如上图红色箭头,需要校验返回值内是否包含"创建满足条件的优惠券"这一内容 如果需要满足以上校验,最好的方法就是使用正则进行匹配 切换到正则匹配,输入需要校验的内容,即可实现正则匹配 ...