当前位置: 首页 > news >正文

新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.mrgr.cn/news/30946.html

相关文章:

  • 访问网页的全过程(知识串联)
  • 搜索引擎的演变与未来发展趋势分析
  • Docker安装部署RabbitMQ(详细教程)
  • go语言中的接口含义和用法详解
  • springboot 整合mybatis
  • Sql server查询数据库表的数量
  • 条件编译代码记录
  • Nomad Web服务终于成熟了!
  • 学习使用Docker
  • Tableau Einstein 重磅亮相,融合 AI 与数据云提供统一且无缝的分析新体验!
  • 需求3:照猫画虎
  • 第314题|参考!如何做到【一题多解】|武忠祥老师每日一题
  • Linux操作系统 进程(3)
  • 免密执行远程服务命令
  • Revit学习记录-版本2018【持续补充】
  • Streamlit:使用 Python 快速开发 Web 应用
  • 我的数据库旅程:从迷茫到觉醒
  • 1332. 删除回文子序列 脑筋急转弯
  • 《俄语翻译通》app一款专业的俄文OCR识别器,学俄语不会颤音怎么办?《俄语翻译通》可以帮助你!
  • Windows用管理员运行cmd命令后无法切换盘符
  • 23个Python在自然语言处理中的应用实例
  • TiDB 中的自增主键有哪些使用限制,应该如何避免?
  • HCL Domino 14.5EAP1快问快答
  • 解决Filament中使用ARCore出现绿色闪屏的问题
  • 力扣150题——多维动态规划
  • 【高阶用法】uniapp的i18n多语言模块修复与增强(Typescript)