CTF-Web安全

攻防世界-Crypto-sleeping-guard

2019-07-17  本文已影响1人  简言之_

题目信息

image
题目给了服务器及端口号和一份python代码(攻防世界给掉了)
import base64
from twisted.internet import reactor, protocol
import os
 
PORT = 9013
 
import struct
def get_bytes_from_file(filename):  
    return open(filename, "rb").read()  
    
KEY = "[CENSORED]"
 
def length_encryption_key():
    return len(KEY)
 
def get_magic_png():
    image = get_bytes_from_file("./sleeping.png")
    encoded_string = base64.b64encode(image)
    key_len = length_encryption_key()
    print 'Sending magic....'
    if key_len != 12:
        return ''
    return encoded_string 
    
 
class MyServer(protocol.Protocol):
    def connectionMade(self):
        resp = get_magic_png()
        self.transport.write(resp)
 
class MyServerFactory(protocol.Factory):
    protocol = MyServer
 
factory = MyServerFactory()
reactor.listenTCP(PORT, factory)
reactor.run()

我们从服务器收到了base64编码的文本。


image

它可能是python代码中提到的png图像所以我们解码并将其保存到为out.png:

nc 111.198.29.45 47726 | base64 --decode > out.png

试图打开图像,图像查看器无法打开文件。使用文本查看器打开文件,看到没有PNG标头。所以现在我们有图像,但它以某种方式编码,我们需要找出如何解码它。


image

让我们看一下脚本,答案可能就在那里。在使用base64对文件进行编码后,脚本将检查加密密钥的大小是否为12。

关键代码:
KEY = "[CENSORED]"
 
def length_encryption_key():
    return len(KEY)
    
    if key_len != 12:

除了编码本身之外,我们在脚本中看不到任何加密,但我们可以假设在原始脚本中使用12字节长密钥完成加密。但加密什么?有十亿种选择,我们如何找到合适的解密算法?嗯,答案很简单 - 这是一个CTF,管理员知道我们不能尝试所有可能的解密方法,所以它可能是平庸的选择:异或。

在选择我们的加密方法后,让我们考虑如何找到密钥本身。我们知道该文件是PNG图像,因此我们可以将加密文件的前12个字节与正常PNG文件的前12个字节进行异或。

89 50 4E 47 0D 0A 1A 0A 00 00 00 0D XOR DE 3F 0F 2F 52 4B 45 41 65 79 21 32  == 57 6F 41 68 5F 41 5F 4B 65 79 21 3F  

在ASCII中是:“ WoAh_A_Key!?”
现在我们有了密钥,我们可以运行python脚本,要在Linux环境下运行,得到的图片才能打开,windows环境下不行

def xor(data, key):
    l = len(key)
    return bytearray((
        (data[i] ^ key[i % l]) for i in range(0,len(data))
    ))
 
# Read the encrypted image as bytearray
data = bytearray(open('out.png', 'rb').read())
 
# This is our key as bytearray: "WoAh_A_Key!?"
key = bytearray([0x57, 0x6f, 0x41, 0x68, 0x5f, 0x41, 0x5f, 0x4b, 0x65, 0x79, 0x21, 0x3f])
 
with open('decrypted.png', 'w') as file_:
    file_.write(xor(data,key))

得到flag


image
上一篇下一篇

猜你喜欢

热点阅读