【问题标题】:Hide Answers of Python Quiz隐藏 Python 测验的答案
【发布时间】:2020-04-06 01:58:18
【问题描述】:

这是我在这里的第一篇文章,希望有人能给我一些帮助!

我目前正在为一个大学项目开发​​ Capture The Flag (CTF),作为其中的一部分,我想参与一个 Python 测验;验证用户的答案是否正确。

虽然我编写了一个相当简单的脚本来完成工作,但我想到的一个潜在问题是用户可以简单地在 gedit 或 nano 中打开 Python 脚本并轻松找到答案。我尝试了一些解决方案,但我想不出任何可靠的方法。

正如我所说,代码本身相当简单,但我想我将其包含在内只是为了让您了解我目前所掌握的内容:

import sys

answer = ("Blessed be our saviour, a warrior...")
userInput = input("What does the decrypted text read? ")

if userInput == answer:
    print("Correct, the way is open")
else:
    print("Incorrect! The way is barred until you find the solution!")
    sys.exit(0)

我真的不知道这是否可能,但我想我不妨问问。

感谢您提供的任何建议!

【问题讨论】:

  • 您可以加密用户提供的字符串,然后将其与加密的答案字符串进行比较。
  • 您可以使用一些简单的加密方法对答案进行编码,例如 f.i. Vigenere 密码字符串编码,或以某种数据格式将其存储在磁盘上。
  • 如果您希望明文答案不能从文件中的数据导出,请使用加密哈希算法。 docs.python.org/3/library/hashlib.html 但是,如果您的用户可以在编辑器中打开文件,那么是什么阻止他们更改检查答案是否正确的条件?
  • 我觉得加密是不够的,因为他们可以看到加密方式,然后反过来。您可以将答案存储为散列(参见例如 this site )并简单地存储答案散列,并将用户输入与散列值进行比较。任何超越这种事情的人都应该得到满分甚至更多。至于编辑脚本以使答案正确,您始终可以分发 .pyc 文件。虽然扭转这一点并不难,但我认为在这种情况下,这比人们关心的要付出更多的努力
  • 防止逆向工程的唯一可靠方法是不分发代码(以纯文本或编译形式)。 IOW,让它成为一个网络应用程序;-)

标签: python ctf


【解决方案1】:

要么以某种包含所有答案的二进制数据类型将其存储在磁盘上,要么使用一些简单的加密技术,例如 f.i。维吉尼亚密码。

以下是使用 Vigenere 密码进行加密的函数的简短示例:

def encode_string(key, string):
    """Encode a string using the Vigenere cipher."""
    if isinstance(key, (int, float)):
        key = str(key)
    if isinstance(string, (int, float)):
        string = str(string)
    encoded_chars = []
    for i in range(len(string)):
        key_c = key[i % len(key)]
        encoded_c = chr(ord(string[i]) + ord(key_c) % 256)
        encoded_chars.append(encoded_c)
    encoded_string = "".join(encoded_chars)
    return encoded_string

使用此函数,您可以对答案进行编码,例如:

encoded_answer = encode_string('this is some key', 'This is the answer')

编码的答案是encoded_answer='ÈÐÒæ@Òæ@ç×Ò\x85\x81ÙØðÙÚ'。 您可以将编码后的答案硬编码到您的测验中。

要检查正确答案,只需使用相同的密钥对输入进行编码并将其与硬编码的答案进行比较:

if encode_string('this is some key', userInput) == encoded_answer:
    print("Correct, the way is open")
else:
    print("Incorrect! The way is barred until you find the solution!")
    sys.exit(0)

【讨论】:

  • 既然可以import hashlib,为什么还要使用弱加密方案?请注意,您的方法需要在提供给用户的文件中包含密钥,因此他们解密答案所需要做的就是将 + 更改为 -
  • 因为手工做一些基本的东西真的很有趣,特别是如果它是为了在大学学习。此外,对于这样的事情,弱编码应该就足够了。 :) 是的,将+ 解码为- 就足够了。但是要知道这一点,您已经需要了解一些有关密码学的基础知识。因此,对于像这样的“弱安全案例”,这应该没问题,而且它是学习密码学基础知识的一种有趣/有趣的方式。对于这种情况,恕我直言,没有必要使用“大枪”,尤其是如果您有可能学到一些东西。
  • 我同意这是一个微不足道的案例,但要平衡一下。通过交换到行业标准的哈希函数,他们没有失去任何学习机会(为什么你认为在代码中更改一些字母会减损任何东西?)。被介绍给 MD5 后,他们确实错过了了解当前正确的哈希方法是什么的机会,并且如果他们在多年后遇到此类问题,可能会对错误的方法产生持久的印象
  • 在我上大学的时候,我们总是从一个小事开始,然后逐步增加难度。我们没有直接从零到火箭科学。因此,Vigenere 密码是对密码学的一个很好的介绍,尤其是在查看密码学的历史时。对我来说,了解基础知识永远不会导致对错误方法的持久印象。根据我的经验,它总是在寻找更深入的主题时有所帮助。
【解决方案2】:

如上所述,如果用户可以打开并查看您的脚本,有什么可以阻止他们将您的检查更改为 if True or ... 以绕过它?

也就是说:

使用答案的 sha256 哈希。

然后,对用户回答的内容进行哈希处理,看看是否匹配。

sha256 是一种单向哈希,您无法阅读脚本并知道生成它的内容。

简单编码器:

import hashlib

def encode(str):
  return hashlib.sha256(str).hexdigest()

print("Encoded string: %s" %(encode("Test")))

输出为:532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25

所以,你的脚本:

import sys

answer = '532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25' # encode("Test") -> Change "Test" to whatever your answer is
userInput = input("What does the decrypted text read? ")
hashedUserInput = encode(userInput)

if hashedUserInput == answer:
    print("Correct, the way is open")
else:
    print("Incorrect! The way is barred until you find the solution!")
    sys.exit(0)

在您的脚本中使用该值。

【讨论】:

    【解决方案3】:

    您可以将答案存储在用户无权访问的单独.yml 文件中,例如:data.yml

    您的.yml 文件将如下所示:

    answer: Blessed be our saviour, a warrior...

    您的代码将如下所示:

    import sys
    import yaml
    data = yaml.load(open('data.yml'))
    
    answer = data['answer']
    userInput = input("What does the decrypted text read? ")
    
    if userInput == answer:
        print("Correct, the way is open")
    else:
        print("Incorrect! The way is barred until you find the solution!")
        sys.exit(0)
    

    然后将您的文件设置为只读模式,这样用户将无法编辑和打印答案。你可以这样做:

    chmod 0444 filename.py

    PS:将.yml 文件保存在最终用户无法访问的路径中。如果没有,您可以使用hashlib 通过编码来隐藏文件的路径。如果您使用的是 unix,则可以通过执行 chmod -rwx data.yml 锁定 data.yml 文件,并且最终用户无法打开该文件。

    希望这会有所帮助!

    【讨论】:

    • 这到底是如何工作的?如果用户能够打开该文件,那么他们可能有权访问该程序使用的任何其他文件。
    • 这里假设一个 Unix 系统。该程序必须以具有读取 YAML 文件权限的不同用户身份运行,并且真实用户需要以不同用户身份运行该程序的权限(可能为 sudo)。
    • 您可以将文件存储在经过身份验证的驱动器上。但这是稍微复杂的解决方案。最简单的方法是在data.yml 上执行chmod -rwx 以防止打开文件。
    • 但是脚本必须能够打开文件,因此您只需修改脚本以将内容转储到其他地方的另一个文件中或直接转储到终端中。当然,这超出了简单的介绍性测验,但跟随兔子洞很有趣:)
    猜你喜欢
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多