新160个crackme - 060-snake

news/2024/9/25 7:15:35/

运行分析

在这里插入图片描述

  • 需破解Name和Serial

PE分析

在这里插入图片描述

  • 32位,未知程序和壳
    在这里插入图片描述
  • 点击Scan/t按钮外部扫描,发现是C++程序

静态分析&动态调试

在这里插入图片描述

  • ida搜索关键字符串,双击进入

在这里插入图片描述

  • 发现无法反编译

在这里插入图片描述

  • 选中该函数(地址:401048 - 401172)
  • Edit -> Functions -> Delete function
  • 然后再选中该函数,按P键创建函数

在这里插入图片描述

  • 按F5,反编译成功
  • 分析主函数,注释如上图,还需要知道sub_401173、sub_40119B和sub_40120C函数功能

在这里插入图片描述

  • 分析sub_401173,发现其作用是初始化变量dword_401AF0

在这里插入图片描述

  • 动调sub_40119B函数,发现函数作用是根据Name决定0xCC和0xDD位置和个数
    在这里插入图片描述
  • 看一下结果,结合题目为snake,猜测为16*16的贪吃蛇地图

在这里插入图片描述

  • 动调sub_40120C函数,其作用是模拟贪吃蛇的轨迹,具体如下:
  • 1、贪吃蛇初始长度为1,蛇头位置为0x99
  • 2、提取Serial每一位进行&3计算,得到结果转化为蛇头上下左右行为
    0 -> 16 -> ↑
    1 -> -16 -> ↓
    2 -> -1 -> ←
    3 -> 1 -> →
  • 3、每吃到一个0xCC,蛇身+1,蛇头不能撞到蛇身,必须吃完0xCC,最后再吃0xDD,即可弹窗成功

算法分析

from ctypes import *def sub_40119B():         # 根据Name决定0xCC和0xDD位置和个数global dword_401B00global dword_401700# Name每个字符相加得到v2v2 = c_uint8(0)for i in Name:v2.value = (v2.value + ord(i)) & 0xff# Name每个字符进行计算,改变dword_401B00的值n = 0v5 = c_uint8(0)for i in range(len(Name)):v5.value = (v2.value ^ ord(Name[i]))v2.value -= v5.valuedword_401B00[v5.value] |= 0xCC# 对dword_401B00[v5]赋值0xDDi = c_uint8(0)i.value = v5.value ^ v2.valuewhile 1:v5.value = v5.value - i.valueif (dword_401B00[v5.value] != 0xCC):breaki.value = i.value - 1dword_401B00[v5.value] = 0xDDv5.value = i.valuewhile ( dword_401B00[v5.value] == 0xCC or dword_401B00[v5.value] == 0xDD):v5.value = v5.value - 1dword_401B00[v5.value] = 0x99# 对dword_401700赋值dword_401700 = v5.valuedef sub_40120C():global mapsglobal Serial# 对地图进行分块for i in range(0,16):maps.append(dword_401B00[16*i:16*(i+1)])# 获取0xCC坐标点addr_CC = []for y in range(0,16):for x in range(0,16):if maps[y][x] == 0xCC:addr_CC.append([x,y])# 获取0xDD坐标addr_DD = []for x in range(0,16):for y in range(0,16):if maps[y][x] == 0xDD:addr_DD.append([x,y])# 获取初始蛇头位置addr_99 = []for x in range(0,16):for y in range(0,16):if maps[y][x] == 0x99:addr_99.append([x,y])# 蛇头吃0xCC行动轨迹for i in range(len(addr_CC)-1,-1,-1):y =  addr_99[0][1] - addr_CC[i][1]x =  addr_99[0][0] - addr_CC[i][0]if y >= 0 :Serial += '1' * yelse:Serial += '0' * (-y)if x >= 0:Serial += '2' * xelse:Serial += '3' * (-x)addr_99[0] = addr_CC[i]# 蛇头吃0xDD行动轨迹y =  addr_99[0][1] - addr_DD[i][1]x =  addr_99[0][0] - addr_DD[i][0]if y >= 0 :Serial += '1' * yelse:Serial += '0' * (-y)if x >= 0:Serial += '2' * xelse:Serial += '3' * (-x)if __name__ == '__main__':Name = 'c'				# 假设Name长度为1Serial = ''dword_401B00 = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00]maps = []sub_40119B()sub_40120C()print(Name + '的Serial为:\n' + Serial)

在这里插入图片描述

在这里插入图片描述

  • 因为未限制Name个数,所以假设Name长度为1,这样比较简单
  • 验证成功

http://www.ppmy.cn/news/1530174.html

相关文章

第十四届蓝桥杯嵌入式国赛

一. 前言 本篇博客主要讲述十四届蓝桥杯嵌入式的国赛题目,包括STM32CubeMx的相关配置以及相关功能实现代码以及我在做题过程中所遇到的一些问题和总结收获。如果有兴趣的伙伴还可以去做做其它届的真题,可去 蓝桥云课 上搜索历届真题即可。 二. 题目概述 …

【ArcGIS微课1000例】0121:面状数据共享边的修改方法

文章目录 一、共享边概述二、快速的修改办法1. 整形共享边2. 修改边3. 概化边缘一、共享边概述 面状数据共享边指的是两个或多个面状数据(如多边形)共同拥有的边界。在地理信息系统(GIS)、三维建模、大数据分析等领域,面状数据共享边是描述面状空间数据拓扑关系的重要组成…

新能源汽车充电桩怎么选?

新能源汽车是我国七大战略性新兴产业之一,已成为汽车产业转型升级的重要推动力。毫无疑问。充电桩作为我国新能源汽车产业链下游的重要环节,在国家政策的大力支持和市场需求的带动下,有着非常广阔的前景。安科瑞叶西平187-06160015 新能源汽…

VsCode C语言 SDL包配置 2024.9

写这篇文章的起因是,最近我需要使用 SDL 包,我懒得下载V-studio ,所以直接在VsCode 里配置C环境。我搞了好几个小时,啥都弄好了,但是一直被下面几个问题缠绕导致demo启动不了,现在我记录一下这奇葩的解决过程。所有路径…

遨游信息技术的浩瀚宇宙:探索MySQL的深邃奥秘

遨游信息技术的浩瀚宇宙:探索MySQL的深邃奥秘 在信息技术的浩瀚宇宙中,MySQL犹如一颗璀璨的星辰,以其稳定、高效、灵活的特性,照亮了无数开发者与数据管理者的前行之路。作为关系型数据库管理系统的佼佼者,MySQL不仅承…

使用数据泵(Data Pump)迁移Oracle数据库数据

目的 将一个oracle数据库实例数据复制给另一个实例 注意事项 sqlplus(即在本机linux环境下执行sql)、expdp、impdp等命令一般需要切换到oracle用户才能执行 如果你当前是linux的root用户,请切换用户 su - oracle //一般在oracle账号下才能…

新手教学系列——为表格行增加倒计时列

在现代网页开发中,许多应用场景都需要显示倒计时功能,例如在线促销的限时抢购、拍卖会的剩余时间、或是订单支付的有效期。这类倒计时信息通常以动态的形式展现在表格中,随着时间的流逝,倒计时也会自动更新。这篇文章将带你一步步实现一个动态倒计时表格功能,展示如何为表…

【RabbitMQ】⾼级特性

RabbitMQ ⾼级特性 1. 消息确认1.1 消息确认机制1.2 代码示例 2. 持久化2.1 交换机持久化2.2 队列持久化2.3 消息持久化 3. 发送⽅确认3.1 confirm确认模式3.2 return退回模式3.3 问题: 如何保证RabbitMQ消息的可靠传输? 4. 重试机制5. TTL5.1 设置消息的TTL5.2 设置队列的TTL…