美文网首页CTF-Web安全
攻防世界-Crypto-sleeping-guard

攻防世界-Crypto-sleeping-guard

作者: 简言之_ | 来源:发表于2019-07-17 21:16 被阅读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

相关文章

  • 攻防世界-Crypto-sleeping-guard

    题目信息 我们从服务器收到了base64编码的文本。 它可能是python代码中提到的png图像所以我们解码并将其...

  • 攻防世界新手

    就按照题目的难易程度写 新手区没有涉及到栈的相关知识,几乎是栈漏洞 get_shell 第一个题目比较简单 ida...

  • 攻防世界 lottery

    .git源码泄露/题目也给了附件下载源码/访问robots.txt也能看到.git代码审计,审了好久都没找到漏洞点...

  • 2019-05-30 新手练习区完结

    至此攻防世界的pwn新手练习区完结了

  • 攻防世界 Re wp

    hello ctf sprintf():int sprintf( char *buffer, const char...

  • 攻防世界 Crypto wp

    easy rsa p和q为选取的两个大素数 e为随机选取的小于r =(p-1)(q-1)的数 d为e关于模r的模反...

  • 攻防世界 Pwn wp

    0x01get_shell 下载附件后直接丢IDA F5 0x02CGfsb 先用checksec查看开了哪些保护...

  • 攻防世界 string wp

    参考:CTF-wiki格式化字符串漏洞利用 0x01寻找漏洞 -checksec -在IDA中对文件进行分析。 查...

  • iOS安全攻防

    iOS安全攻防 iOS安全攻防

  • 攻防世界-Web_php_unserialize

    高手进阶区,Web_php_unserialize 题目来源:攻防世界[https://adworld.xctf....

网友评论

    本文标题:攻防世界-Crypto-sleeping-guard

    本文链接:https://www.haomeiwen.com/subject/caxhlctx.html