目录
链接:https://pan.baidu.com/s/1Lnu3HwyGhU1Ba2EK7W9K_A?pwd=lulu
提取码:lulu
--来自百度网盘超级会员V3的分享
前几天打了nkctf ,因为自己也是主打misc,顺便也复现一遍,
一点自己的拙见,各位师傅见笑了
感谢各位读者,对我的支持( •̀ ω •́ )y 有什么问题和建议可以私聊我




得到flag
NKCTF{wtk2023Oo0oImcoM1Ng!23555647}


下载附件 得到如下三个文件
Vmdk ovf格式 一看就是虚拟机格式
那我们第一反应肯定使用虚拟机VMaware打开
直接点击ovf文件直接挂载就可以了

挂载成功之后如上图
我会发现有两个登录用户
但是无论点击哪个都需要密码的


这时候这种方法就不可用了 我们要及时止损
经验丰富的人这时候会想到另外两种挂载方式

这里我就不一一展示了 我拿第一个举例DiskGenius


挂载之后 我们随便打开一个文件看看 会发现如下图提示

再找找

得到flag
NKCTF{wE1come_to_NKCTF20233}

游戏题 不细讲
找东方wiki的修改器
thprac.v2.2.1.2.exe
进入练习模式前改分,进入
提示解密了,在replay看到了叫flag的记录
在文件里,用010打开,在文件末


附件下载

不用想就知道这个压缩包需要解压密码

果然 那后面的两个图片就是解压密码
一个height 一个width
很难不让人先想到一个高度,一个宽度
那就先把height.bmp先拖010里

直接改高度
保存得到下图

试了一下发现不行 那肯定是密码的一部分
接下来我们想办法恢复width.bmp的宽
这里如果在010里一个一个去试的话不好试
这里我们提供两种解法
宽要根据bmp性质算一下,因为是32位深,所以1589466/4/283=1404
所以图片的宽为1404 直接拖进010里改就行

我们直接上脚本(#爆破bmp的宽)
import struct
import zlib
f = open('misc31.bmp','rb')
c = f.read()
width = c[18:22]
height = c[22:26]
for i in range(900,1500):
f1 = open('bpout'+str(i)+'.bmp','wb')
img = c[:18]+struct.pack('>i',i)[::-1]+c[22:]
f1.write(img)
f1.close()

最后无论那种方法都可以得到

总和得到密码
BMP_Height_width_easy
解压得到图片 还是一个bmp格式的
八成还是改长宽高
最简单的方法就是拖010里 自己调试
当然长宽均被设置为 1 的 bmp 图片,由于颜色通道是灰度而不是 RGB,数据大小为 129600 Bytes,于是将图片长宽均设置为 360 并保存

保存得到二维码

得到flag
NKCTF{eab1291e-9e37-4ff1-b76d-f1af63eaad43}

挺简单的题,不要想复杂
下载附件只有一张图片 图片挺大呀 看的我眼花

那就正常思路先走一下
010进一下 看一下格式
Stegsolve再进一下 看看有什么信息
但很遗憾没有什么特别的
那下一步怎么办
进kali 使用zsteg 一把梭
zsteg 三体.bmp -a

这一看就知道了吧 明显是flag反过来了
先到出来
zsteg -E 'b8,b,lsb,xY' 三体.bmp >1.txt

就直接使用string查看字符串 关键字


综合得到flag
NKCTF{3d77dc1a37b2d1ebf489c973f554ea10}

下载附件 里面有连个压缩包


Rgb需要密码 所以我们只能从key下手
打开key发现一堆散乱的图片碎片
那不用想 拼图
如果有Montage+gaps的环境
Montage+gaps拼图得到key
montage *.png -tile 30x6 -geometry +0+0 flag_tmp.pnggaps --image flag_tmp.png --size 125 --save#
说明一下参数
30x6和125#-tile:设置每行每列的原始图片数量,
30x6 表示拼图的宽30张 高6张,这个要结合gaps多尝试几种不同组合才能得到正确的尺寸。#--size: 这里每张图片为125像素

如果没Montage+gaps的环境也可以
我们仔细观察会发现只有几个图片里有 字符的

我们就把他们单独挑出来 也不多

最后在PS拼起来就可以了
得到密码
NKCTF2023
那我们继续
解压rgb.zip
里面有三个txt文件


rgb呀很熟悉呀 放一起看看

我们仔细观察
会发现他是把一个文件的RGB三个数值单独提取出来
所以我们要再把他们 合在一起
在010里创建个十六进制文本
我们按rgb的顺序一位一位的依次粘贴到010里
要么我们就使用脚本
# 读取字节
file1 = open("r.txt", "rb")
file2 = open("g.txt", "rb")
file3 = open("b.txt", "rb")
# 写入字节
p = open("decode.txt", "wb")
data = []
# 循环1669次,每次依文件顺序读取
for a in range(149):
# 设定每次往后读取一个字节
i = file1.read(1)
data.append(i)
i = file2.read(1)
data.append(i)
i = file3.read(1)
data.append(i)
for i in data:
p.write(i)
得到原格式

然后复制
再010里粘贴自十六进制

保存为zip文件
得到一个flag.txt文件


压缩包末尾提示 AES-128
这是AES加密 加上之前得到的密钥
在线网站

得到flag
NKCTF{603fcdfc-652b-40e4-90cf-f27c2edc2d9f}

压缩包里有文档 但文档加密

但有提示
小明这个笨蛋,给文档设置了一个密码,但是他自己却忘记了密码,他知道以下信息:
1.
密码是数学和小写英语的随机生成的
2.
hash函数:
输出大小 256 bits 内部大小 256 区块大小 512 长度大小 64 字符尺寸 32
3.
密码:h??vO??0 (?号部分为小明已经忘记的位置)
哈希:b75d1224 ... (后面不记得了...)
上脚本
import string
import hashlib
s = 'b75d1224'
chars = string.ascii_letters + string.digits # 构造字符集
print (chars)
for i in chars:
for j in chars:
for k in chars:
for n in chars:
psw = 'h' + i + j + 'vO' + k + n + '0'
sha256 = hashlib.sha256(psw.encode(encoding='utf-8')).hexdigest()
if s ==sha256[0:8]:
print(psw)

得到 密码
h4evOF90
打开文档之后呀
假flag

这样我们先关掉加密

拖到010里查看格式
惊奇的发现是压缩包的格式
二话不说直接改后缀

在里面找到了一个png的图片

KEY:Welcome_to_NKCTF
得到一个密钥
看来肯定是什么隐写
并且用 StegSolve 发现有 LSB 隐藏信息的痕迹
经过多次尝试 发现是cloacked-pixel
工具开源地址
Python2 lsb.py extract image1.png out Welcome_to_NKCTF

运行得到flag
NKCTF {dc0684dd-5a57-4d47-b9c0-debed0ef28b9}

里面只有一个txt文件 (做完之后才发现这个题才是套娃)

文本最后是 社会主义核心价值观编码
那就想从你下手

rabbit 又 move
这看样子是个提示呀
接下来只能看看上面的字符了
根据题目提示想到了可能是垃圾邮件解密
在线网址
spammimic - decodespammimic - decode
https://www.spammimic.com/decode.shtmlspammimic - decode


得到
与佛论禅
在线网站
https://tools.takuron.top/talk-with-buddha/ 密码rabbit(上一个解码得出来的)

&auD5v'<)`h{dF6C_*'Jrcqzrh&ZaF>`g^Hr'}vuHZJB%~}_H5?gu;q)"<rA?{sH2{IfafKfu=6w_tip:47&13
这一看就是0宽字符
在线网址
Unicode Steganography with Zero-Width Characters
https://www.mzy0.com/ctftools/zerowidth1

解密得到key:EnoOoO1G
结合结尾的tip:47&13 应该是rot编码
密文是rot47处理,密钥是rot13处理,
解rabbit即可

U2FsdGVkX19L5uer0YVyC4BKC9U+2um18/wCVNGFw+yqTON0wdn8FjBXQkCpnLDwaLx727z7FleH0

RabBbB1T
最后使用rabbit解密

得到flag
NKCTF{H4Ppy_tH3_Y34r_0f_R4BbBbbbB1tTtTtT}

里面只要音频

先拖进010里看一下格式

仔细观察会发现
2710和2711 出现这么多次
明显有明显规律
27作为分割,10 11出现
怀疑二进制,11是1 10是0
这就需要我们处理一下
上脚本
def bytes2hex(bytes):
num = len(bytes)
hexstr = u""
for i in range(num):
t = u"%x" % bytes[i]
if len(t) % 2:
hexstr += u""
hexstr += t
return hexstr.upper()
# 读取字节
file1 = open("flag.wav", "rb")
# 写入字节
p = open("flag1.txt", "wb")
data = []
for a in range(20000000):
# 设定每次往后读取一个字节
i = file1.read(2)
i = bytes2hex(i)
if i == '1027':
data.append(b'0')
elif i == '1127':
data.append(b'1')
elif i == '':
break
for i in data:
p.write(i)
运行

运行得到
二进制文本
在010里创建一个十六进制文本,复制刚刚运行得到的,粘贴自二进制

这一看就是一个压缩包的格式
保存加后缀zip
打开一看 还需要密码 但有提示

刚开始还以为还是二进制
后来感觉不像 尝试之后
发现是摩斯密码
0是.
1是-
保存到文本里
使用脚本转换一下
def read_file(filepath):
with open(filepath) as fp:
content=fp.read();
return content
result = read_file('lu1.txt')
result = result.replace(r'0','.')
result = result.replace(r'1','-')
with open('lu2.txt', 'w') as f:
f.write(result)

最后再加上分隔符 / (手敲就可以了)

解码

WELCOMETONKCTF,THEPASSWORDIS16BYTESRANDOMLYGENERATED,ISTHEREABETTERWAYTOUNLOCKTHEZIP?

又是作者的一个小套路
但也是个提示
告诉我们是16位字符
因此肯定没法爆破(除非超强计算机才能在短时间破解)
但是在010里查看时发现zip里面是png,且算法符合明文攻击的前提,因此用bkcrack爆破密钥,得到flag.png:
先创一个png文件头的文件
构造明文头 16字节就可以了

bkcrack.exe -C 1.zip -c flag.png -p flag.out
当然不构造文件头也可以 还快捷
就直接使用这个命令
bkcrack.exe -C 1.zip -c flag.png -x 0 89504E470D0A1A0A0000000D49484452

得到密钥
Keys: 846ad344 02327731 173ff347
然后爆破
bkcrack.exe -C 1.zip -c flag.png -k 846ad344 02327731 173ff347 -d flag1.png

得到图片

就是flag
NKCTF{You_are_very_smart!!}

也是只有个音频

根据提示需要找到三个密码
拖AU里
在音频最前端发现有规律的波形

根据规律就是二进制解密
高波位时1 低波位是0
01110000 01110011 01100100 01000001 00111010 00111000 00110011 00111001 00110111 00111001 00110011 00110110 00110111
因为说过密码是八位数
所以很容易想到ASCLL码

得到
psdA:83979367
还是在AU里
打开频谱图

拖动滑轮

得到
PsdB:74208645
音频解码都试过了
那就先看看源文件格式吧

得到
psdC:01374890
拿到三个密码
接下就是解密
这里使用openpuff
打开openpuff 点击unhide


输入三个密码 按顺序


弹出之后
解密成功
打开保存目录

得到
NKCTF{52d446a51c6896af878f872e0d748118}

只有一张图片

打开属性

39MB的大小
里面肯定有东西
直接分离
(之前我还使用kali分离结果什么都没有)
先脱进010里

会发现后面一大半都是另外的
所以提出来 保存

根据提示
我们使用veracrypt进行破译
保存1,
挂载1,密钥文件为NBLOGO.png

按照上面步骤挂载


弹出这个说明加载成功了
返回我的电脑 就会看见多出个磁盘

打开 里面只有一张图片

原本准备进一步分析这张图片却发现 图片里隐隐约约可以看到一些东西
我果断打开ps
但怎么改才清晰呢
我又打开了010

在尾部发现了提示
566*566
打开ps 打开画布大小



得到flag
NKCTF{49ce8740502743585C4a44404e62d8f9}
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
//1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json
有没有一种简单的方法可以判断ruby脚本是否已经在运行,然后适本地处理它?例如:我有一个名为really_long_script.rb的脚本。我让它每5分钟运行一次。当它运行时,我想看看之前运行的是否还在运行,然后停止第二个脚本的执行。有什么想法吗? 最佳答案 ps是一种非常糟糕的方法,并且可能会出现竞争条件。传统的Unix/Linux方法是将PID写入文件(通常在/var/run中)并在启动时检查该文件是否存在。例如pid文件位于/var/run/myscript.pid然后你会在运行程序之前检查它是否存在。有一些技巧可以避免
我正在开发一个Ruby脚本,需要在没有Ruby解释器的情况下部署到系统上。它将需要在使用ELF格式的FreeBSD系统上运行。我知道有一个ruby2exe项目可以编译在Windows上运行的ruby脚本,但是在其他操作系统上这样做容易吗?甚至可能吗? 最佳答案 您是否检查过Rubinius或JRuby是否允许您预编译您的代码? 关于ruby-ruby脚本可以预编译成二进制文件吗?,我们在StackOverflow上找到一个类似的问题: https://
我目前可以将stdout重定向到ruby/rails中的字符串变量,只需在bash中运行命令并将结果设置为我的字符串变量,如下所示。val=%x[#{cmd}]其中cmd是表示bash命令的字符串。但是,这仅捕获stdout,因为我想捕获stderr并将其设置为ruby中的字符串——有什么想法吗? 最佳答案 简单地重定向它:val=%x[#{cmd}2>&1]如果您只想从stderr捕获输出,请在将其复制到fd2后关闭stdout的文件描述符。val=%x[#{cmd}2>&1>/dev/null]
我们如何从ruby脚本返回值?#!/usr/bin/envrubya="test"a我们如何在Ubuntu终端或java或c中访问'a'的值? 最佳答案 在ruby/python脚本中打印你的变量,然后可以通过示例从shell脚本中读取它:#!/bin/bashruby_var=$(rubymyrubyscript.rb)python_var=$(pythonmypythonscript.py)echo"$ruby_var"echo"$python_var"注意你的ruby/python脚本只打印这个变量(有更多复杂的方
我在跑Fastlane(适用于iOS的持续构建工具)以执行用于解密文件的自定义shell脚本。这是命令。sh"./decrypt.shENV['ENCRYPTION_P12']"我想不出将环境变量传递给该脚本的方法。显然,如果我将密码硬编码到脚本中,它就可以正常工作。sh"./decrypt.shmypwd"有什么建议吗? 最佳答案 从直接Shell中扩展假设这里的sh是一个faSTLane命令,它以给定的参数作为脚本文本调用shell命令:#asafastlanedirectivesh'./decrypt.sh"$ENCRYPTI
我希望这些值匹配。当shell脚本由于某些错误条件而退出时(因此返回非零值),它们不匹配。壳$?返回1,ruby$?返回256。>>%x[lskkr]ls:kkr:Nosuchfileordirectory=>"">>puts$?256=>nil>>exitHadoop:~Madcap$lskkrls:kkr:NosuchfileordirectoryHadoop:~Madcap$echo$?1 最佳答案 在Ruby中$?是一个Process::Status实例。打印$?等同于调用$?.to_s,这等同于$?.to_i.to_s(来