新160个crackme - 060-snake

运行分析

在这里插入图片描述

  • 需破解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.xdnf.cn/news/144800.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

无人机之AI跟踪篇

无人机的AI识别技术依托于计算机视觉和深度学习技术,实现了对目标的快速精准识别,在多个领域展现出了巨大的应用潜力和价值。以下是对无人机AI识别技术的详细解析: 一、无人机AI识别算法的基础原理 无人机AI识别算法主要基于先进的计算机视觉…

celery

文章目录 celery1. celery的基本使用![请添加图片描述](https://i-blog.csdnimg.cn/direct/aa33d094580c4434a55644cd74e2a6c0.png)2. celery的进阶使用3. django-celery实现异步HTTP请求 celery Celery 是一个开源的分布式任务队列系统,它允许开发者将耗时的任务异…

Redhat 6,7,8系(复刻系列) 一键部署Oracle12c zip

Oracle12c前言 Oracle 12c是甲骨文公司推出的一款关系数据库管理系统,它引入了多项创新特性,如多租户架构、大数据处理和云部署,适用于企业级应用。以下是Oracle 12c的详细介绍: Oracle 12c的主要特点 高性能:通过多线程处理、自动优化等技术,提高了数据库的查询和处理…

基于STM32红外感应的自动迎客人语音控制系统设计

文章目录 前言资料获取设计介绍功能介绍设计程序具体实现截图设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…

相图数据对于纳米材料研究的积极作用

纳米材料因其独特的物理、化学和生物学特性,在环境保护,能源领域,生物医学,航空航天等多个领域展现出广泛的应用潜力。在纳米材料合成过程中,通过相图可以识别出在特定温度和压力下材料的稳定相和不稳定相,…

git第一次首次提交本地代码到远程仓库详细步骤(初始化提交)

参考文章 :https://blog.csdn.net/qq_22182989/article/details/139098265 假如报错关联git仓库出现的问题。 error: remote origin already exists.解决方案: 1、先输入git remote rm origin 删除关联的origin的远程库 2、关联自己的仓库 git remote a…

文心一言 VS 讯飞星火 VS chatgpt (351)-- 算法导论24.1 2题

二、证明推论24.3。推论 24.3 的内容是设 G ( V , E ) G(V,E) G(V,E)是一带权重的源结点为 s s s的有向图,其权重函数为 ω : E → R ω:\boldsymbol{E→R} ω:E→R。假定图 G G G不包含从源结点 s s s可以到达的权重为负值的环路,则对于所有结点 v ∈ …

mat (Eclipse Memory Analyzer Tool)使用以及详解

前言 在Java开发中,内存问题往往不易被发现,但它们可能导致应用性能下降甚至崩溃。Eclipse Memory Analyzer Tool(MAT)是一个强大的开源工具,专门用于分析Java堆转储(heap dumps)文件&#xff…

js 将二进制文件流,下载为excel文件

吃西瓜 现成的粒子 二进制流,是一种计算机文件格式,它的数据以二进制形式存储,与文本文件不同, 二进制文件可以包含任意类型的数据,例如:图像、音频、视频、可执行文件、压缩文件等,而文本文…

Acwing Hash表

哈希表的作用:把一个比较大的空间,通过一个函数映射到一个比较小的空间 一般做哈希运算时,取一个质数作为模,会使得冲突的概率降低。 哈希表的冲突解决方法: 拉链法开放寻址法 下面详细介绍这两种方法的原理及其实现…

自制网络连接工具(支持tcpudp,客户端服务端)

自制网络连接工具&#xff08;支持tcp/udp,客户端/服务端&#xff09; 将网络连接工具制作成共享库 network.h #ifndef NETWORK_H #define NETWORK_H#include<netinet/in.h> #include<sys/socket.h> #include<stdbool.h> typedef struct Network {int type…

JAVA基础:包装类,BigInteger , BigDecimal

1 包装类 java是一种面向对象的编程语言 对象都是由类产生的。 8种基本类型对java面向对象的特性有所破坏 jdk就提供了8种基本类型所对应的类的表示&#xff0c;称为&#xff1a;包装类 理论上来讲&#xff1a;类属性使用包装类定义&#xff0c;方法中的局部变量使用基本类型…

javamail发邮件:配置SMTP发送邮件的步骤?

javamail发邮件的教程指南&#xff1f;怎么用JavaMail发送邮件&#xff1f; JavaMail API 是 Java 平台上用于发送和接收电子邮件的标准 API&#xff0c;它提供了一套丰富的类和方法&#xff0c;使得开发者能够轻松地实现邮件发送功能。AokSend将详细介绍如何使用 JavaMail AP…

基于atlas环境下YOLOV7的睡岗识别

做到这里&#xff0c;其实只是想探索下新的检测框架、探索下atlas下ACL的推理方式。整个过程持续了3-4周把&#xff0c;回顾一下&#xff0c;感觉还是需要一些技巧才能拿下&#xff0c;如果没有任何经验的是断难搞定此代码的。主要基于华为的官方例子&#xff0c;里面修改了原始…

峟思科普:溢流坝是什么?溢流坝承载着哪些作用

水坝系统中的一项关键组成部分——溢洪结构&#xff0c;又常被称作溢洪道&#xff0c;其独特功能在于精准调控水库水位&#xff0c;确保水坝安全。当水库蓄水量超过预设阈值&#xff0c;该结构能够引导多余水流平稳穿越坝体&#xff0c;注入下游河床。此过程中&#xff0c;坝前…

Snapchat API 访问:Objective-C 实现示例

Snapchat 是一个流行的社交媒体平台&#xff0c;它允许用户发送和接收短暂存在的图片和视频。对于开发者来说&#xff0c;访问 Snapchat API 可以为应用程序添加独特的社交功能。本文将介绍如何在 Objective-C 中实现对 Snapchat API 的访问&#xff0c;并提供一个详细的代码示…

uni-app页面调用接口和路由(四)

文章目录 一、路由二、页面调用接口二、路由跳转1.uni.navigateTo(OBJECT)2.uni.redirectTo(OBJECT)3.uni.reLaunch(OBJECT)4.uni.switchTab(OBJECT)5.uni.navigateBack(OBJECT) 总结 一、路由 路由配置 uni-app页面路由为框架统一管理&#xff0c;开发者需要在pages.json里配…

yolo自动化项目实例解析(四)ui页面整理1 (1.85)

我们在上一章整理main.py 的if __name__ __main__: 内容还留下面这一段&#xff0c; from PyQt5.QtWidgets import *from lanrenauto.moni.moni import *from PyQt5.QtGui import *app QApplication(sys.argv) # 初始化Qt应用ratio screen_width / 2560 # 分辨率比例# 设…

centos 安装VNC,实现远程连接

centos 安装VNC&#xff0c;实现远程连接 VNC(Virtual Network Computing)是一种远程控制软件&#xff0c;可以实现通过网络远程连接计算机的图形界面。 服务器安装VNC服务 yum install -y tigervnc-server*启动VNC服务&#xff0c;过程中需要输入连接密码 vncserver :1查看…

全国网安众测招募计划启动啦,欢迎加入~

在数字化时代&#xff0c;网络安全已成为维护社会稳定、促进经济发展的基石。为了积极响应国家关于加强网络安全工作的号召&#xff0c;确保某区域关键信息系统的稳固运行&#xff0c;我们特此启动一项网络安全众测活动。该活动旨在通过汇聚业界有经验的网络安全攻防人才&#…