前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >攻防世界_misc部分wp

攻防世界_misc部分wp

作者头像
回天
发布2023-04-25 15:11:48
7880
发布2023-04-25 15:11:48
举报
文章被收录于专栏:Ga1@xy's W0r1dGa1@xy's W0r1d

图片隐写

[2019_NJUPT_CTF] a_good_idea

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

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

代码语言:javascript
复制
try to find the secret of pixels

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

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

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

代码语言:javascript
复制
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 进行图片容差比较

image-20200319165120745
image-20200319165120745

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

image-20200319165148301
image-20200319165148301

[2017世安杯] low

  • 考点:LSB隐写 & python绘图

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

代码语言:javascript
复制
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可调出一个二维码:

1581675019139
1581675019139

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

代码语言:javascript
复制
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 ,于是编写代码绘制图片:

代码语言:javascript
复制
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:

1581674880370
1581674880370

red_green

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

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

代码语言:javascript
复制
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 库需要进行安装:

代码语言:javascript
复制
pip install bitstring

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

image-20200306174403044
image-20200306174403044

[su-ctf-quals-2014] Avatar

  • 考点:outguess无密钥

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

代码语言:javascript
复制
outguess -r 1.jpg out.txt

得到隐藏的信息即为flag

代码语言:javascript
复制
We should blow up the bridge at midnight

wireshark相关

[ISCC-2017] 就在其中

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

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

1581748731203
1581748731203

继续追踪tcp流可看到:

1581748837103
1581748837103
1581748854111
1581748854111

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

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

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

代码语言:javascript
复制
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打开:

1582197677868
1582197677868

以下全为参照网上wp写下的过程 可以看到是802.11的无线数据包,需要借助 aircrack-ng破解他的密码,先查看

1582199400539
1582199400539

图中的BSSID应该就是MAC地址了 按照大佬的教学,aircrack-ng的命令使用格式为 aircrack-ng -w password.txt -b [MAC] [capfile] 于是我们按照大佬的格式进行操作:

1582198419943
1582198419943

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

1582198502128
1582198502128

还是没能成功破解密码,我便上网找了一个关于aircrack-ng的教程: https://blog.csdn.net/qq_36119192/article/details/84254622 在这篇博客中写了 -w 后应该加密码字典的位置,也就是说刚刚大佬的wp中password.txt代表的就是他的密码字典,在我刚刚找到的这个博客中写道: kali下自带有一份无线密码字典——> /usr/share/wordlists/rockyou.txt.gz,我们需要将其解压 于是接下来我们就要进行这个字典的解压操作:

1582198875039
1582198875039

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

1582199156331
1582199156331

成功得到密码:12345678 之后再解密出cap文件:airdecap-ng [capfile] -e [ESSID] -p [password]

1582199651848
1582199651848

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

1582200273037
1582200273037

我们可以看到上传图片的包中cookie格式为JWT格式(header.payload.signature) 附上关于JWT格式的详解: https://www.cnblogs.com/jinbuqi/p/10361698.html 于是我们将cookie进行解密:

1582200748714
1582200748714

看到提示:为了安全起见,我把密码设置成了我刚刚ping过的一个网站 于是从ping中查看,想到ping域名之前,一定要通过DNS来获取域名指向的ip,于是过滤DNS协议:

1582200874042
1582200874042

尝试其中的域名后发现解压密码为最后一个域名:26rsfb.dnslog.cn 解压后即可得到flag:flag{f14376d0-793e-4e20-9eab-af23f3fdc158}

音频隐写

[XCTF 3rd-RCTF-2017] intoU

  • 考点:频谱图信息涂抹

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

image-20200331194315494
image-20200331194315494

压缩包

[defkthon-ctf] Miscellaneous-300

  • 考点:python循环解压zip包

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

代码语言:javascript
复制
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中安装转换工具
代码语言:javascript
复制
sudo pip install rockstar-py
  • 接下来在 .rock 文件所在文件夹中打开终端输入
代码语言:javascript
复制
rockstar-py --output 1.py 1.rock

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

代码语言:javascript
复制
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 ,直接进入解题过程:

1582451300392
1582451300392

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

1582451447313
1582451447313

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

1582451497383
1582451497383

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

代码语言:javascript
复制
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 ,接下来我们还原明文:

代码语言:javascript
复制
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进制数值全部复制下来

1583042889656
1583042889656

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

代码语言:javascript
复制
import zlib

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

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

代码语言:javascript
复制
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查看,可以看到文件头错误:

1583043876734
1583043876734

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

1583043963648
1583043963648

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

1583044137176
1583044137176

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

1583044196967
1583044196967

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

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

1583044317026
1583044317026

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

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

[XCTF 3rd-RCTF-2017] message

  • 考点:hex转bin & word观察

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

代码语言:javascript
复制
7fffffffffffffffffffffffffffffffbffff0e10419dff07fdc3ffdaeab6deffdbfff6ffed7f7aef3febfffb7ff1bfbc675931e33c79fadfdebbae7aeddedb7dafef7dc37df7ef6dbed777beedbedb77b6de24718f260e0e71879fffffffffffffffffffffffffffffffffffffffffff07f87fc7f9ffffffffdbfbbfdbfeffffffffebfdffdfff7ffffff871c33e6fe7bffffffd5aefeed62dcffffffeadf9fb8bb0efffffff56df5db6dbf7ffffffaa0c21e19e3bffffe07ffffffffff9fffffffffffffffffffffffffffffffffffffff

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

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

代码语言:javascript
复制
a=0x7fffffffffffffffffffffffffffffffbffff0e10419dff07fdc3ffdaeab6deffdbfff6ffed7f7aef3febfffb7ff1bfbc675931e33c79fadfdebbae7aeddedb7dafef7dc37df7ef6dbed777beedbedb77b6de24718f260e0e71879fffffffffffffffffffffffffffffffffffffffffff07f87fc7f9ffffffffdbfbbfdbfeffffffffebfdffdfff7ffffff871c33e6fe7bffffffd5aefeed62dcffffffeadf9fb8bb0efffffff56df5db6dbf7ffffffaa0c21e19e3bffffe07ffffffffff9fffffffffffffffffffffffffffffffffffffff
print len(bin(a)[2:]),bin(a)[2:]
image-20200310143445629
image-20200310143445629

分解1679可得到 1679=23*73

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

代码语言:javascript
复制
a='11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111011111111111111111100001110000100000100000110011101111111110000011111111101110000111111111111011010111010101011011011011110111111111101101111111111111101101111111111101101011111110111101011101111001111111110101111111111111110110111111111110001101111111011110001100111010110010011000111100011001111000111100111111010110111111101111010111011101011100111101011101101110111101101101101111101101011111110111101111101110000110111110111110111111011110110110110111110110101110111011110111110111011011011111011011011011101111011011011011110001001000111000110001111001001100000111000001110011100011000011110011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000001111111100001111111110001111111100111111111111111111111111111111111110110111111101110111111110110111111111011111111111111111111111111111111111010111111110111111111110111111111111101111111111111111111111111111000011100011100001100111110011011111110011110111111111111111111111111111101010110101110111111101110110101100010110111001111111111111111111111111110101011011111100111111011100010111011000011101111111111111111111111111111010101101101111101011101101101101101101111110111111111111111111111111111101010100000110000100001111000011001111000111011111111111111111111100000011111111111111111111111111111111111111111111001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'
out=''
for i in range(0,len(a),73):
 print a[i:i+73]

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

image-20200310144116844
image-20200310144116844

即可得到flag:RCTF{ArEciBo_mEsSaGe}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 图片隐写
    • [2019_NJUPT_CTF] a_good_idea
      • [2017世安杯] low
        • [2017世安杯] 适合作为桌面的图片
          • [defkthon-ctf] Miscellaneous-200
            • red_green
              • [su-ctf-quals-2014] Avatar
              • wireshark相关
                • [ISCC-2017] 就在其中
                  • [2019_Redhat] 恶臭的数据包
                  • 音频隐写
                    • [XCTF 3rd-RCTF-2017] intoU
                    • 压缩包
                      • [defkthon-ctf] Miscellaneous-300
                      • 其他
                        • [2019_NJUPT CTF] Become_a_Rockstar
                          • [2019_DDCTF] MulTzor
                            • [CISCN-2018-Quals] picture2
                              • [XCTF 3rd-RCTF-2017] message
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档