menu Ga1@xy's Wor1d
攻防世界_misc部分wp
1291 浏览 | 2020-05-07 | 阅读时间: 约 6 分钟 | 分类: wp,MISC,攻防世界 | 标签: Misc,刷题wp,攻防世界
请注意,本文编写于 530 天前,最后修改于 302 天前,其中某些信息可能已经过时。

图片隐写

[2019_NJUPT_CTF] a_good_idea

  • 考点:python绘图 & 图片容差比较
  • 方法一

下载后解压得到一张图片,扔进binwalk后得到两张看起来一样的图片和一个hint.txt,打开txt文件看到

try to find the secret of pixels

意为:尝试找到像素的秘密

接下来内容为参考网上的wp: https://blog.csdn.net/YUK_103/article/details/104151168

运行以下脚本后即可得到一张二维码,扫码即得flag

from PIL import Image
im1 = Image.open("to.png")
im2 = Image.open("to_do.png")
p1 = im1.load()
p2 = im2.load()
w = im1.size[0]
h = im1.size[1]

im = Image.new('RGB',(290,289))
p = im.load()

for i in range(w):
 cnt = 0
 for j in range(h):
     if p1[i, j] != p2[i, j]:
         p[i,j] = (255,255,255)
im.show()
  • 方法二

用工具 Beyond Compare 进行图片容差比较

即可直接得到二维码,扫码得到flag:NCTF{m1sc_1s_very_funny!!!}

[2017世安杯] low

  • 考点:LSB隐写 & python绘图

题目是一张bmp图片,根据提示low可以是LSB隐写,python脚本如下

import PIL.Image as Image

img = Image.open('low.bmp')
img_tmp = img.copy()
pix = img_tmp.load()
width,height = img_tmp.size
for w in range(width):
    for h in range(height):
        if pix[w,h]&1 == 0:
            pix[w,h] = 0
        else:
            pix[w,h] = 255

img_tmp.show()

运行后可得到一张图片,将其中二维码颜色取反后扫描即可得到flag

[2017世安杯] 适合作为桌面的图片

  • 考点:pyc文件反编译

下载压缩包解压后得到一张图片,将图片导入stegsolve可调出一个二维码:

在线网站扫码可得16进制字符串:

03F30D0A79CB05586300000000000000000100000040000000730D0000006400008400005A000064010053280200000063000000000300000016000000430000007378000000640100640200640300640400640500640600640700640300640800640900640A00640600640B00640A00640700640800640C00640C00640D00640E00640900640F006716007D00006410007D0100781E007C0000445D16007D02007C01007400007C0200830100377D0100715500577C010047486400005328110000004E6966000000696C00000069610000006967000000697B000000693300000069380000006935000000693700000069300000006932000000693400000069310000006965000000697D000000740000000028010000007403000000636872280300000074030000007374727404000000666C6167740100000069280000000028000000007304000000312E7079520300000001000000730A0000000001480106010D0114014E280100000052030000002800000000280000000028000000007304000000312E707974080000003C6D6F64756C653E010000007300000000

将其复制后打开winhex粘贴到新文件,选择ASCII Hex格式后确定,观察可知为pyc文件,将文件保存为1.pyc后将其反编译:uncompyle6 1.pyc > 1.py

运行1.py即可得到flag:flag{38a57032085441e7}

[defkthon-ctf] Miscellaneous-200

  • 考点:python已知像素点绘图

下载得到一个txt文件,里面有61366行,每行三个数字,大部分为 255,255,255 ,于是可推断以此txt文件可绘制一幅图片,将 61366 分解可得 61366 = 503*122 ,于是编写代码绘制图片:

from PIL import Image
x = 503
y = 122
img = Image.new('RGB',(503,122),"black")
f = open('flag.txt','r')
pix=[]
for i in range(61366):
    a = f.readline()
    a = a.replace('\n','')
    pix.append(a)

#print pix
im = []
for i in range(len(pix)):
    im.append(pix[i].split(','))

#print im
for i in range(x):#x = 503
    for j in range(y):#y = 122 
        pix = (int(im[i*122+j][0]),int(im[i*122+j][1]),int(im[i*122+j][2]))
        img.putpixel((i,j),pix)#写某个像素位置的值

img.show()

运行代码后可得flag:

red_green

  • 考点:识别颜色转换01序列 & python绘图

下载附件后打开可得到一张只有红色绿色的图片,经过各种试验发现并不是正常的图片隐写,于是改变方向,由于图片只由红色和绿色构成,便可以想到读取图片的颜色,将其中的红色和绿色视为0 和 1,再将最后得到的 01序列 转存为图片,下面为python代码:

from PIL import Image
import bitstring

im = Image.open('1.png')
width = im.size[0]
height = im.size[1]
pim = im.load() # 读取图片的像素信息
bin_result = ''
for h in range(height):
    for w in range(width):
        if pim[w,h][0] == 255: # 判断是否是红色(R,G,B)[0]表示第一通道
            bin_result += '1'
        else:
            bin_result += '0'

# print bitstring.BitArray(bin=bin_result).bytes.encode('hex')
with open('result.jpg','wb') as f:
    f.write(bitstring.BitArray(bin=bin_result).bytes)

两个for循环顺序如果颠倒的话,就无法得到图片,在编写脚本时可以进行尝试即可确定哪种顺序正确

初次使用 bitstring 库需要进行安装:

pip install bitstring

运行脚本即可得到一张图片,flag在图片中:flag{134699ac9d6ac98b}

[su-ctf-quals-2014] Avatar

  • 考点:outguess无密钥

下载得到一张jpg图片,经过010editor分析没有什么特别之处,一时间没有什么思路,看到网上的wp才知道是outguess加密,之前一直认为outguess一定需要密码,但是通过这道题得知outguess也可以进行无密钥加密

outguess -r 1.jpg out.txt

得到隐藏的信息即为flag

We should blow up the bridge at midnight

wireshark相关

[ISCC-2017] 就在其中

  • 考点:流量分析 & OpenSSL解密RSA

下载附件并解压可得到一个 .pcapng 的文件,用wireshark打开并追踪tcp流可看到含有以下四个文件

继续追踪tcp流可看到:

可判断此题应用 openssl 来解密rsa,附上openssl使用方法: https://www.jianshu.com/p/c945b0f0de0a

我们将整个流量包丢进binwalk分离可得到 key.txt 文件,将其解密即可得到flag

将刚刚追踪tcp流得到的rsa私钥保存为 key.pem 文件,然后通过openssl解密:

openssl rsautl -decrypt -in key.txt -inkey key.pem -out out.txt

打开 out.txt 即可看到flag:hi, boys and girls! flag is {haPPy_Use_0penSsI}

[2019_Redhat] 恶臭的数据包

  • 考点:破解无线数据包

下载附件并解压,可得到一个cap文件,可知这是一道流量分析题,用wireshark打开:

以下全为参照网上wp写下的过程

可以看到是802.11的无线数据包,需要借助 aircrack-ng 来破解他的密码,先查看

图中的BSSID应该就是MAC地址了

按照大佬的教学,aircrack-ng的命令使用格式为 aircrack-ng -w password.txt -b [MAC] [capfile]

于是我们按照大佬的格式进行操作:

却发现并没有成功,报错信息为没有成功打开 password.txt ,于是我又自己新建了一个 password.txt 的文件重新进行操作:

还是没能成功破解密码,我便上网找了一个关于aircrack-ng的教程: https://blog.csdn.net/qq_36119192/article/details/84254622

在这篇博客中写了 -w 后应该加密码字典的位置,也就是说刚刚大佬的wp中password.txt代表的就是他的密码字典,在我刚刚找到的这个博客中写道:

kali下自带有一份无线密码字典——> /usr/share/wordlists/rockyou.txt.gz,我们需要将其解压

于是接下来我们就要进行这个字典的解压操作:

两次ls命令列出文件的对比可以看到,rockyou.txt.gz已经成功解压,接下来我们再进行一次密码爆破:

成功得到密码:12345678

之后再解密出cap文件:airdecap-ng [capfile] -e [ESSID] -p [password]

解密出的cap文件为cacosmia-dec.cap使用wireshark查看,导出http流中最大的文件并命名为file,直接把file扔进binwalk,可分离出一个加密过的压缩包,经过尝试发现爆破和伪加密都不能解开压缩包,于是我们查看数据包,追踪tcp流:

我们可以看到上传图片的包中cookie格式为JWT格式(header.payload.signature)

附上关于JWT格式的详解: https://www.cnblogs.com/jinbuqi/p/10361698.html

于是我们将cookie进行解密:

看到提示:为了安全起见,我把密码设置成了我刚刚ping过的一个网站

于是从ping中查看,想到ping域名之前,一定要通过DNS来获取域名指向的ip,于是过滤DNS协议:

尝试其中的域名后发现解压密码为最后一个域名:26rsfb.dnslog.cn

解压后即可得到flag:flag{f14376d0-793e-4e20-9eab-af23f3fdc158}

音频隐写

[XCTF 3rd-RCTF-2017] intoU

  • 考点:频谱图信息涂抹

下载附件是个音频,时长4分51秒,播放音频,在最后快结束时可以听到一些电流声(不正常的声音),用audacity打开查看频谱图,在最后即可看到flag:RCTF{bmp_file_in_wav}

压缩包

[defkthon-ctf] Miscellaneous-300

  • 考点:python循环解压zip包

下载附件得到压缩包,经过多次尝试发现每个压缩包的密码与压缩包内文件名相同,于是编写py脚本:

import zipfile
import re

zipname = '46783.zip'
while True:
    if zipname != '73168.zip':
        ts1 = zipfile.ZipFile(zipname)
        res = re.search('[0-9]*',ts1.namelist()[0])
        print res.group()
        passwd = res.group()
        ts1.extractall(pwd=passwd)
        zipname = ts1.namelist()[0]
    else:
        print 'find'

解压到 12475.zip 时报错,打开后发现其中含有一个wav文件,爆破得到解压密码,将音频拖入Audacity查看频谱图即可得到flag

其他

[2019_NJUPT CTF] Become_a_Rockstar

  • 考点:Rockstar语言

下载附件后解压可得到一个 Become_a_Rockstar.rock 的文件,扔进kali中变为一个文档文件,打开后可看到里面有一整篇类似文章的东西,看到后毫无头绪,百度wp后才得知这是一个名为 Rockstar 的语言!!

接下来我们可将这个Rockstar转为python进行编译:

  • 首先在kali中安装转换工具
sudo pip install rockstar-py
  • 接下来在 .rock 文件所在文件夹中打开终端输入
rockstar-py --output 1.py 1.rock

即可得到转换成python的代码,打开后删去其中多余(没用)的代码再进行编译即可得到flag

leonard_adleman = "star"
problem_makers = 76
problem_makers = "NCTF{"
def God(World):
    a_boy = "flag"
    the_boy = 3

def Evil(your_mind):
    a_girl = "no flag"
    the_girl = 5

Truths = 3694
Bob = "ar"
adi_shamir = "rock"
def Love(Alice, Bob):
    Mallory = 13
    Mallory = 24

Everything = 114514
Alice = "you"
def Reality(God, Evil):
    God = 26
    Evil = 235

ron_rivest = "nice"
def you_want_to(Alice, Love, Anything):
    You = 5.75428

You = 5
Nothing = 31
if Truths * Nothing == Everything:
    RSA = ron_rivest + adi_shamir + leonard_adleman

if Everything / Nothing == Truths:
    problem_makers = problem_makers + Alice + Bob

print(problem_makers)
the_flag = 245
the_confusion = 244
print(RSA)
mysterious_one = "}"
print(mysterious_one)

flag: NCTF{youarnicerockstar}

[2019_DDCTF] MulTzor

  • 考点:xortool的使用

下载附件可得到一个txt文件,打开后是经过十六进制编码后的字符串,直接用十六进制解码后会发现是乱码

一时间没了头绪,于是决定参考网上wp,才知道是经过xor加密过的,本题还需要用到一个工具 xortool,工具的安装和使用方法可见 misc相关工具(kali+win).md ,直接进入解题过程:

打开生成的 xortool_out 文件夹,将其中得到的 0.out 文件扔进winhex观察,我们会在文件最后发现flag的身影,不过却是错误的:

我们观察文件的开头会发现:

本应该是 Cryptanalys 这个单词却变成了 Crypt$nalys 这样,观察后面的文件内容会发现这个得到的文件中的单词字母总会发生错误,再通过观察第一个单词中发生错误的字母是整个文件中的第七个字节,而我们得到的密码经过十六进制编码后为 7733ff53598b ,恰好是六个字节,于是我们可以推断第一个字节发生了错误,下面我们就来找到正确的第一字节:

a = '53' #53为原文件中的第七字节所对应的十六进制编码
i = 0
while 1:
 if chr(ord(a.decode('hex')) ^ i == 'a'): #a为第七字节所对应的正确解密结果
     print chr(i).encode('hex')
     break
 else:
     i += 1

得到结果 i=32 ,所以密码正确的第一字节为32,即正确的密码为 3233ff53598b ,接下来我们还原明文:

f = open('123.txt')
a = f.read().strip() #注意这里要删去最后一个换行符,否则接下来无法decode('hex'),因为是奇数位
a = a.decode('hex')
key = '3233ff53598b'.decode('hex')
print(''.join([chr(ord(a[i]) ^ ord(key[i%len(key)])) for i in range(len(a))]))

得到flag:DDCTF{0dcea345ba46680b0b323d8a810643e9}

[CISCN-2018-Quals] picture2

  • 考点:zlib解压 & UUencode编码

下载文件可得到一张图片,扔进binwalk后可看到其中含有zlib文件,打开winhex,由于这是一张jpg格式的图片,查找文件尾 FF D9 ,可看到接下来的由 78 9C 开头的zlib文件,将后面的16进制数值全部复制下来

编写脚本查看zlib文件中的信息:

import zlib

id = '789CAD50CB92A2500CFD2016C2151516BD08EFDB80C54304D979012FF2101015E4EB1B6AA6BB66379B4EA59293E4544E2A3E078A24B900B383520E153BF6FC280A219D6B9587252EE184C432CE9C8C5EC0B997E92DB7754489B05D8161B43EABDB9D7CF7C41E71C4E1D77E5767BDC534AEDE6CD8AA98F809278F6EC4FDC138A20DC3D50775F7D21291561B1C5C2FBB0BB7BA1BB835BA6A77EB4C8730C8DEDE3CEB39E4815093D5C04916B87805FFBB535E867F0CFF20A920C8AB640AF4BB01D20CB59742F9E8CC0EAA40A17EE4E2FD008737C86764A0872D056AAF49F42F7F5E7D5CB0312CE209680F378BBC86209EDA577E1DB9ACE9143C83CD5CEC0CD45CE65A71DB20A9B5220E3FF313EAA9A973AF64EDD2A43ECEBD0D8BF57D4EF481125D9B52B9DC2A6E43B11AB7440F282EC6218BF64D1C8E3D9E80C1D785573D631F464B965A7205818462998663E550D6C432D07FB5C3FAF826ACD7A675359D43F1E9459F6FB2C6DB1FCEF997B20F82E54BC329DA4F2912DFB10C3BF3FB17001F5F8A8CC192'
result = zlib.decompress(id.decode('hex'))
print result
# zlib.decompress('str') 用于解压数据
# zlib.compress('str') 用于压缩流数据

可以得到一串经过base64编码后的字符串,将其解码后写入zip文件:

import zlib
import base64

id = '789CAD50CB92A2500CFD2016C2151516BD08EFDB80C54304D979012FF2101015E4EB1B6AA6BB66379B4EA59293E4544E2A3E078A24B900B383520E153BF6FC280A219D6B9587252EE184C432CE9C8C5EC0B997E92DB7754489B05D8161B43EABDB9D7CF7C41E71C4E1D77E5767BDC534AEDE6CD8AA98F809278F6EC4FDC138A20DC3D50775F7D21291561B1C5C2FBB0BB7BA1BB835BA6A77EB4C8730C8DEDE3CEB39E4815093D5C04916B87805FFBB535E867F0CFF20A920C8AB640AF4BB01D20CB59742F9E8CC0EAA40A17EE4E2FD008737C86764A0872D056AAF49F42F7F5E7D5CB0312CE209680F378BBC86209EDA577E1DB9ACE9143C83CD5CEC0CD45CE65A71DB20A9B5220E3FF313EAA9A973AF64EDD2A43ECEBD0D8BF57D4EF481125D9B52B9DC2A6E43B11AB7440F282EC6218BF64D1C8E3D9E80C1D785573D631F464B965A7205818462998663E550D6C432D07FB5C3FAF826ACD7A675359D43F1E9459F6FB2C6DB1FCEF997B20F82E54BC329DA4F2912DFB10C3BF3FB17001F5F8A8CC192'
result = zlib.decompress(id.decode('hex')).decode('base64')
f=open('out.zip','wb')
f.write(result)
f.close()

得到一个zip文件,当我们打开时会报错,将其拖入winhex查看,可以看到文件头错误:

将文件头改成 50 4B 后再次打开,可以看到文件经过加密,在压缩注释区我们可以看到提示信息:

意思是 ZeroDivisionError 的报错信息即为密码,百度查找该报错信息:

是除数为零时产生的错误,用python实践一下:

得到解压密码:integer division or modulo by zero

解压后得到code文件,改成txt格式后打开:

可以辨认出为 UUencode 编码,解码后即可得到flag:CISCN{2388AF2893EB85EB1B439ABFF617319F}

(UUencode编码参考: http://blog.chacuo.net/753.html

[XCTF 3rd-RCTF-2017] message

  • 考点:hex转bin & word观察

下载附件打开可以得到一长串字符,观察推测为十六进制字符串:

7fffffffffffffffffffffffffffffffbffff0e10419dff07fdc3ffdaeab6deffdbfff6ffed7f7aef3febfffb7ff1bfbc675931e33c79fadfdebbae7aeddedb7dafef7dc37df7ef6dbed777beedbedb77b6de24718f260e0e71879fffffffffffffffffffffffffffffffffffffffffff07f87fc7f9ffffffffdbfbbfdbfeffffffffebfdffdfff7ffffff871c33e6fe7bffffffd5aefeed62dcffffffeadf9fb8bb0efffffff56df5db6dbf7ffffffaa0c21e19e3bffffe07ffffffffff9fffffffffffffffffffffffffffffffffffffff

初步进行hex解码后只能得到无法显示的乱码,所以本题需要另辟蹊径

尝试将hex转bin,可以得到长度为1679的字符串:

a=0x7fffffffffffffffffffffffffffffffbffff0e10419dff07fdc3ffdaeab6deffdbfff6ffed7f7aef3febfffb7ff1bfbc675931e33c79fadfdebbae7aeddedb7dafef7dc37df7ef6dbed777beedbedb77b6de24718f260e0e71879fffffffffffffffffffffffffffffffffffffffffff07f87fc7f9ffffffffdbfbbfdbfeffffffffebfdffdfff7ffffff871c33e6fe7bffffffd5aefeed62dcffffffeadf9fb8bb0efffffff56df5db6dbf7ffffffaa0c21e19e3bffffe07ffffffffff9fffffffffffffffffffffffffffffffffffffff
print len(bin(a)[2:]),bin(a)[2:]

分解1679可得到 1679=23*73

将01字符串每行按照每行73个字符进行输出:

a='11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111011111111111111111100001110000100000100000110011101111111110000011111111101110000111111111111011010111010101011011011011110111111111101101111111111111101101111111111101101011111110111101011101111001111111110101111111111111110110111111111110001101111111011110001100111010110010011000111100011001111000111100111111010110111111101111010111011101011100111101011101101110111101101101101111101101011111110111101111101110000110111110111110111111011110110110110111110110101110111011110111110111011011011111011011011011101111011011011011110001001000111000110001111001001100000111000001110011100011000011110011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000001111111100001111111110001111111100111111111111111111111111111111111110110111111101110111111110110111111111011111111111111111111111111111111111010111111110111111111110111111111111101111111111111111111111111111000011100011100001100111110011011111110011110111111111111111111111111111101010110101110111111101110110101100010110111001111111111111111111111111110101011011111100111111011100010111011000011101111111111111111111111111111010101101101111101011101101101101101101111110111111111111111111111111111101010100000110000100001111000011001111000111011111111111111111111100000011111111111111111111111111111111111111111111001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'
out=''
for i in range(0,len(a),73):
 print a[i:i+73]

将得到的字符串复制到word中,在文档中搜索 0

即可得到flag:RCTF{ArEciBo_mEsSaGe}

全部评论

info 评论功能已经关闭了呐!