HZNUCTF MISC Snake题解——python程序逆向,hashcat爆破sha256

这篇具有很好参考价值的文章主要介绍了HZNUCTF MISC Snake题解——python程序逆向,hashcat爆破sha256。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.Dump得到pyc文件

二.pyc反编译得到py源码

三.分析程序逻辑

四.hashcat爆破


题目附件链接:https://pan.baidu.com/s/1CcS8BPGx8fKnsJgRvEi0bA?pwd=t2yj 
提取码:t2yj

一.Dump得到pyc文件

使用命令:python pyinstxtractor.py snake.exe

HZNUCTF MISC Snake题解——python程序逆向,hashcat爆破sha256

二.pyc反编译得到py源码

在线反编译工具python反编译 - 在线工具 (tool.lu)

这里%e8%b4%aa...是url编码,可以用url编码在线解密修复

HZNUCTF MISC Snake题解——python程序逆向,hashcat爆破sha256

三.分析程序逻辑

代码:

#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 3.8

''' 贪吃蛇小游戏 '''
import random
import sys
import time
import pygame
from pygame.locals import *
from collections import deque

FLAG_IS_ME = "import hashlib \nimport string \nsalt_1 = 'xxxxxxxxxxx' \nsalt_2 = 'xxxxxxxxxxx' \nsalt_3 = 'xxxxxxxxxxx' \nsalt = salt_1 + salt_2 + salt_3 \ndata = 'HZNUCTF{xxxxx}'  #5位 ascii+digits+_ \nsalt_data = salt + data \ndata_sha = hashlib.sha256(salt_data.encode('utf-8')).hexdigest() \nprint(data_sha)  #c08521f3c380906d05ee8afbc7fa2943afb3788d9cec94c1b86771ee35ca4738"
SCREEN_WIDTH = 600
SCREEN_HEIGHT = 480
SIZE = 20


def print_text(screen, font, x, y, text, fcolor=((255, 255, 255),)):
    imgText = font.render(text, True, fcolor)
    screen.blit(imgText, (x, y))


def main():
    pygame.init()
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption('贪吃蛇')
    light = (100, 100, 100)
    dark = (200, 200, 200)
    font1 = pygame.font.SysFont('SimHei', 24)
    font2 = pygame.font.Font(None, 72)
    red = (200, 30, 30)
    (fwidth, fheight) = font2.size('GAME OVER')
    line_width = 1
    black = (0, 0, 0)
    bgcolor = (40, 40, 60)
    pos_x = 1
    pos_y = 0
    b = True
    scope_x = (0, SCREEN_WIDTH // SIZE - 1)
    scope_y = (2, SCREEN_HEIGHT // SIZE - 1)
    snake = deque()
    food_x = 0
    food_y = 0

    def _init_snake():
        snake.clear()
        snake.append((2, scope_y[0]))
        snake.append((1, scope_y[0]))
        snake.append((0, scope_y[0]))

    def _create_food():
        food_x = random.randint(scope_x[0], scope_x[1])
        food_y = random.randint(scope_y[0], scope_y[1])
        if (food_x, food_y) in snake:
            food_x = random.randint(scope_x[0], scope_x[1])
            food_y = random.randint(scope_y[0], scope_y[1])
            continue

    _init_snake()
    _create_food()
    game_over = True
    start = False
    score = 0
    orispeed = 0.5
    speed = orispeed
    last_move_time = None
    pause = False
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
            continue
        if event.type == KEYDOWN or event.key == K_RETURN or game_over:
            start = True
            game_over = False
            b = True
            _init_snake()
            _create_food()
            pos_x = 1
            pos_y = 0
            score = 0
            last_move_time = time.time()
            continue
            if not event.key == K_SPACE or game_over:
                pause = not pause
                continue
                if not (event.key in (K_w, K_UP) or b) and pos_y:
                    pos_x = 0
                    pos_y = -1
                    b = False
                    continue
                    if not (event.key in (K_s, K_DOWN) or b) and pos_y:
                        pos_x = 0
                        pos_y = 1
                        b = False
                        continue
                        if not (event.key in (K_a, K_LEFT) or b) and pos_x:
                            pos_x = -1
                            pos_y = 0
                            b = False
                            continue
                            if not event.key in (K_d, K_RIGHT) and b and pos_x:
                                pos_x = 1
                                pos_y = 0
                                b = False
                                continue
                                screen.fill(bgcolor)
                                for x in range(SIZE, SCREEN_WIDTH, SIZE):
                                    pygame.draw.line(screen, black, (x, scope_y[0] * SIZE), (x, SCREEN_HEIGHT),
                                                     line_width)
                                for y in range(scope_y[0] * SIZE, SCREEN_HEIGHT, SIZE):
                                    pygame.draw.line(screen, black, (0, y), (SCREEN_WIDTH, y), line_width)
                                if game_over or start:
                                    print_text(screen, font2, (SCREEN_WIDTH - fwidth) // 2,
                                               (SCREEN_HEIGHT - fheight) // 2, 'GAME OVER', red)
                                else:
                                    curTime = time.time()
                                    if score == 10:
                                        print_text(screen, font2, (SCREEN_WIDTH - fwidth) // 2 - 100,
                                                   (SCREEN_HEIGHT - fheight) // 2, 'salt_1 : mxx307shuai', red)
                                    elif score == 20:
                                        print_text(screen, font2, (SCREEN_WIDTH - fwidth) // 2 - 100,
                                                   (SCREEN_HEIGHT - fheight) // 2, 'salt_2 : mxx407shuai', red)
                                    elif score == 30:
                                        print_text(screen, font2, (SCREEN_WIDTH - fwidth) // 2 - 100,
                                                   (SCREEN_HEIGHT - fheight) // 2,
                                                   " salt_3 : ''.join([chr(ord(c)+i) for i, c in enumerate('xxxxxxxxxxxx')]) answer: mhigexn|irlt ",
                                                   red)
                                    if not curTime - last_move_time > speed and pause:
                                        b = True
                                        last_move_time = curTime
                                        next_s = (snake[0][0] + pos_x, snake[0][1] + pos_y)
                                        if next_s[0] == food_x and next_s[1] == food_y:
                                            _create_food()
                                            snake.appendleft(next_s)
                                            score += 10
                                            speed = orispeed - 0.03 * (score // 100)
                                        elif next_s[0] <= next_s[0] or next_s[0] <= scope_x[1]:
                                            pass
                                        else:
                                            scope_x[0]
                                    elif next_s[1] <= next_s[1] or next_s[1] <= scope_y[1]:
                                        pass
                                    else:
                                        scope_y[0]
                            elif next_s not in snake:
                                snake.appendleft(next_s)
                                snake.pop()
                            else:
                                game_over = True
    if not game_over:
        pygame.draw.rect(screen, light, (food_x * SIZE, food_y * SIZE, SIZE, SIZE), 0)
    for s in snake:
        pygame.draw.rect(screen, dark, (
        s[0] * SIZE + line_width, s[1] * SIZE + line_width, SIZE - line_width * 2, SIZE - line_width * 2), 0)
    print_text(screen, font1, 30, 7, f'''速度: {score // 100}''')
    print_text(screen, font1, 450, 7, f'''得分: {score}''')
    pygame.display.update()
    continue


if __name__ == '__main__':
    main()

可以看到有一条提示: 

FLAG_IS_ME = "import hashlib \nimport string \nsalt_1 = 'xxxxxxxxxxx' \nsalt_2 = 'xxxxxxxxxxx' \nsalt_3 = 'xxxxxxxxxxx' \nsalt = salt_1 + salt_2 + salt_3 \ndata = 'HZNUCTF{xxxxx}'  #5位 ascii+digits+_ \nsalt_data = salt + data \ndata_sha = hashlib.sha256(salt_data.encode('utf-8')).hexdigest() \nprint(data_sha)  #c08521f3c380906d05ee8afbc7fa2943afb3788d9cec94c1b86771ee35ca4738"z

意思是:
salt=salt1+salt2+salt3            //盐的组成

data='HZNUCTF{xxxxx}'        //5位 ascii+digits+_,限定了字符范围

salt_data=salt+data               //用于sha256计算的字符串是salt+data的形式

data_sha=sha256(salt_data)="c08521f3c380906d05ee8afbc7fa2943afb3788d9cec94c1b867

这里推荐一篇介绍sha256+salt的文章:Sha256Hash+salt 密码加密使用

可以在代码下方找到salt

HZNUCTF MISC Snake题解——python程序逆向,hashcat爆破sha256

salt_1:mxx307shuai
salt_2:mxx407shuai
salt_3:''.join([chr(ord(c)+i) for i, c in enumerate('xxxxxxxxxxxx')]) answer: mhigexn|irlt

salt3是加密过的,这条语句的作用是将字符串中的每个字符加上他在字符串中的位置,求salt3的脚本:

s=''.join([chr(ord(c)-i) for i, c in enumerate('mhigexn|irlt')])
print(s)
#mggdashuaibi

所以salt:mxx307shuaimxx407shuaimggdashuaibi

salt_data:mxx307shuaimxx407shuaimggdashuaibiHZNUCTF{xxxxx}

四.hashcat爆破

hashcat的使用这里推荐几篇文章:

1.密码破解全能工具:Hashcat密码破解攻略

2.hashcat详细使用教程

3.Hashcat命令详解

这里使用Kali Linux自带的hashcat,使用命令:

hashcat -a 3 -m 1400 c08521f3c380906d05ee8afbc7fa2943afb3788d9cec94c1b86771ee35ca4738 mxx307shuaimxx407shuaimggdashuaibiHZNUCTF{?a?a?a?a?a}

其中"-a 3"指定掩码攻击模式,"-m 1400" 指定加密算法为sha256,然后跟上sha256的目标值,最后跟上掩码字符串,花括号内"?a"表示字母或数字或特殊字符

HZNUCTF MISC Snake题解——python程序逆向,hashcat爆破sha256

爆破结果:mxx307shuaimxx407shuaimggdashuaibiHZNUCTF{1s_R4}

得到flag:HZNUCTF{1s_R4}文章来源地址https://www.toymoban.com/news/detail-466469.html

到了这里,关于HZNUCTF MISC Snake题解——python程序逆向,hashcat爆破sha256的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【misc】[NSSRound#12 Basic]Secrets in Shadow --linux提权,shadow文件hash爆破

    首先使用ssh连上主机 : ssh ctf@node5.anna.nssctf.cn -p 28844  接着再输入 ls -a l查看文件 尝试打开文件,发现权限不够,根据题目的提示打开shadow文件 在以前的Linux系统中,用户名、所在的用户组、密码(单向加密)等信息都存储在、/etc/shadow的 文件中,很多软件通过调用这个文件

    2024年02月04日
    浏览(40)
  • 矩阵爆破逆向之条件断点的妙用

    不知道你是否使用过IDA的条件断点呢?在IDA进阶使用中,它的很多功能都有大作用,比如:ida-trace来跟踪调用流程。同时IDA的断点功能也十分强大,配合IDA-python的输出语句能够大杀特杀! 那么本文就介绍一下这个功能点,使用z3来秒解题目。 条件断点 什么是条件断点呢?

    2024年03月09日
    浏览(72)
  • BUUCTF_Misc题目题解记录

    仅记录解题步骤,方便自己没事儿的时候拿出来强化一下记忆,俗话说好记性不如烂笔头,祝我早日卷赢同事(? 有没有和我一样用M1芯片,装不了工具,用不惯虚拟机,做不动杂项(那就更不要说pwn了)的大冤种?看过来呜呜呜呜呜…… 1.下载的附件是一张图片(.jpg),在

    2024年02月01日
    浏览(74)
  • python实现简单的snake game!(1)

    6.结束显示**_ 下面我分布把代码部分列出,最后有总源码 1.设计表格 #定义一个坐标类,可以调用里面的方法获取坐标位置 class Point: row=0 col=0 def init (self, row, col): self.row=row self.col=col def copy(self): return Point(row=self.row, col=self.col) #导入两个模块,pygame和random,一个是游戏库一个是

    2024年04月26日
    浏览(25)
  • 《Python程序设计》 第六章 函数+编程题解

    目录 6-1 使用函数求特殊a串数列和 6-2 使用函数求素数和 6-3 使用函数统计指定数字的个数 6-4 使用函数输出指定范围内Fibonacci数的个数  6-5 使用函数求余弦函数的近似值 6-6 缩写词 7-1 输入列表,求列表元素和(eval输入应用) 7-2 一帮一 7-3 验证“哥德巴赫猜想” 7-4 列表或元组

    2024年02月07日
    浏览(67)
  • 2023-GPLT团体程序设计天梯赛-总决赛 L1题解 【Python】

    有一位软件工程师说过一句很有道理的话: “Good code is its own best documentation.” (好代码本身就是最好的文档)。本题就请你直接在屏幕上输出这句话。 输入格式: 本题没有输入。 输出格式: 在一行中输出 Good code is its own best documentation. 。 输入样例: 输出样例: 代码:

    2024年02月11日
    浏览(50)
  • 《算法还原 - CTF》逆向exe程序 + ida Pro 反汇编分析伪C代码 + python算法复现

    二进制安全,能干什么 逆向分析: 负责成品软件的技术原理. 比如分析竞品软件,吸取技术上的优点,进行技术难点公关 病毒分析: 负责分析病毒样本.研究恶意代码的技术手段等工作.主要是在安全公司,尤其是在杀毒软件公司需求较多.如360 、腾讯电脑管家等. 漏洞挖掘分析: 负责

    2024年01月22日
    浏览(52)
  • java: 程序包sun.misc不存在

    下载页面:https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html 我找了CSDN上面,说的都很简洁,对于我这种java小白来说,有点过于的跳跃,导致不知道说的是什么。 从后面看,柳林林,已于 2022-09-05 08:52:56 修改,7790, 收藏 3 这个是说明白了,但是对于小白,

    2024年02月11日
    浏览(37)
  • 78 Python开发-多线程Fuzz&Waf异或免杀&爆破

    协议模块使用,Request爬虫技术,简易多线程技术,编码技术,Bypass后门技术 掌握利用强大的模块实现各种协议连接操作(爆破或利用等),配合Fuzz吊打WAF等 Python开发-简单多线程技术实现脚本 queue,threading模块使用 Python开发-利用FTP模块实现协议爆破脚本 1.ftplib模块使用 2.遍历

    2024年02月03日
    浏览(54)
  • 【idea工具报错】程序包sun.misc不存在 的问题如何解决

    【idea工具报错】程序包sun.misc不存在 的问题如何解决 idea工具出现下面这个报错 :   java: 程序包sun.misc不存在  赤裸裸的报错,但是idea在编译代码 build的时候就报上面这个错误。 先说我的解决办法吧: 上面第3步这里全部改成jdk1.8的配置,如下图:   我本机器安装了多个

    2024年02月12日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包