re学习(36)看雪CTF 2017 -Crackme

百度网盘已收集,需要回顾在文件夹【CTF题库收集】查看即可

刚开始先运行一下

这是一道crackme类型题目,是一道看雪CTF上的竞赛题,用OD进行分析一下。

刚开始用的是IDA分析,分析了半天也没有看出来什么,然后就在网上搜,还真搜出来了,直接上flag,解决了我的燃眉之急,哈哈,事后又看了看wp,才知道了真正的解法,还是应该总结的,毕竟有的题目是搜不到的......

问题:为什么用OD,不用IDA呢?

OD可以动态跟踪变量变化过程。OD反汇编代码可以着色,比较醒目。Crackme类题目

                              →动调首选

IDA可以看到数据结构乃至反汇编至C代码,有利于把握整体结构。

                              →静调首选

在OD中运行程序,发现在地址00401494处运行函数后出来messagebox,可知这是关键函数,F2下断点,F7跟进

在跟进这个函数的过程中,会发生Windows GUI -- 消息循环与消息,可以参考这篇文章

Windows GUI -- 消息循环与消息_gui 消息循环_我家有一口鱼塘的博客-CSDN博客

好像是必须得输入东西才能跳出这个循环,然后下断点,F9运行并输入字符跳出循环

在哪里下断点呢?如果在这里下断点,下图,

运行完后,就会直接报错了因为汇编指令retn用来结束当前过程返回到上一调用过程

所以最早得在这条汇编指令的下一条指令下断点

成功在断点处运行下来了,接下来就是反汇编的关键代码了:
 

CPU Disasm
地址        十六进制数据            指令                             注释                                                             标签
00401225   .  83F8 04       CMP EAX,4
00401228   .  59            POP ECX
00401229   .  0F85 A0000000 JNE 004012CF                   strlen()函数
0040122F   .  6A 30         PUSH 30
00401231   .  59            POP ECX
00401232   .  384D E4       CMP BYTE PTR SS:[EBP-1C],CL    判断key第1个字符是否为“0”
00401235   .  0F84 94000000 JE 004012CF
0040123B   .  384D E5       CMP BYTE PTR SS:[EBP-1B],CL    判断key第2个字符是否为“0”
0040123E   .  0F84 8B000000 JE 004012CF
00401244   .  384D E6       CMP BYTE PTR SS:[EBP-1A],CL    判断key第3个字符是否为“0”
00401247   .  0F84 82000000 JE 004012CF
0040124D   .  384D E7       CMP BYTE PTR SS:[EBP-19],CL    判断key第4个字符是否为“0”
00401250   .  74 7D         JE SHORT 004012CF
00401252   .  807D E4 31    CMP BYTE PTR SS:[EBP-1C],31    判断key第1个字符是否等于“1”,不等于则直接跳转弹出“error”
00401256   .  75 77         JNE SHORT 004012CF
00401258   .  807D E5 35    CMP BYTE PTR SS:[EBP-1B],35    判断key第2个字符是否等于“5”,不等于则直接跳转弹出“error”
0040125C   .  75 71         JNE SHORT 004012CF
0040125E   .  74 03         JE SHORT 00401263              花指令
00401260   .  75 01         JNE SHORT 00401263
00401262      E8            DB E8                          CHAR 'è'
00401263   >  66:B8 0800    MOV AX,8
00401267   .  66:35 0700    XOR AX,0007
0040126B   .  0FBE45 E6     MOVSX EAX,BYTE PTR SS:[EBP-1A] 取输入key的第3位数
0040126F   .  2BC1          SUB EAX,ECX                    减去0x30,得到a
00401271   .  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX   把得到的值保存在[ebp-0x4]中
00401274   .  0FBE45 E4     MOVSX EAX,BYTE PTR SS:[EBP-1C] 取输入key的第1位值“1”
00401278   .  DB45 FC       FILD DWORD PTR SS:[EBP-4]      把[ebp-0x4]中保存的值压入到ST(0)中
0040127B   .  2BC1          SUB EAX,ECX                    0x31减去0x30,则为1
0040127D   .  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX   把得到的值1保存在[ebp-0x4]中
00401280   .  0FBE45 E5     MOVSX EAX,BYTE PTR SS:[EBP-1B] 取输入key的第2位值“5”
00401284   .  DB45 FC       FILD DWORD PTR SS:[EBP-4]      把[ebp-0x4]中保存的值1压入到ST(0)中
00401287   .  2BC1          SUB EAX,ECX                    0x35减去0x30,则为5
00401289   .  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX   把得到的值5保存在[ebp-0x4]中
0040128C   .  DA75 FC       FIDIV DWORD PTR SS:[EBP-4]     st(0)中的值1除以[ebp-0x4]中的值5,得到0.2保存到st(0)中
0040128F   .  0FBE45 E7     MOVSX EAX,BYTE PTR SS:[EBP-19] 取输入key的第4位值
00401293   .  2BC1          SUB EAX,ECX                    减去0x30,得到b
00401295   .  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX   把得到的值b保存在[ebp-0x4]中
00401298   .  DEE9          FSUBP ST(1),ST                 st(1)-st并保存在st(0)中,即(a-0.2)
0040129A   .  DA4D FC       FIMUL DWORD PTR SS:[EBP-4]     st(0)乘以[ebp-0x4] 中保存的值b,结果保存在st(0)中
0040129D   .  D80D 1C714000 FMUL DWORD PTR DS:[40711C]     数据段ds:[0x40711C]值为16,这里则是st(0)乘以16
004012A3   .  D95D FC       FSTP DWORD PTR SS:[EBP-4]      把上面得到值保存在[ebp-0x4]中
004012A6   .  74 03         JE SHORT 004012AB
004012A8   .  75 01         JNE SHORT 004012AB
004012AA      E8            DB E8                          CHAR 'è'
004012AB  />  66:B8 0800    MOV AX,8
004012AF  |.  66:35 0700    XOR AX,0007
004012B3  |.  D945 FC       FLD DWORD PTR SS:[EBP-4]       取出[ebp-0x4]中保存的值
004012B6  |.  D81D 18714000 FCOMP DWORD PTR DS:[407118]    得出的值与384比较是否相等
004012BC  |.  6A 00         PUSH 0
004012BE  |.  68 78804000   PUSH OFFSET 00408078           ASCII "CrackMe 2017 CTF"
004012C3  |.  DFE0          FSTSW AX
004012C5  |.  9E            SAHF
004012C6  |.  75 0E         JNE SHORT 004012D6
004012C8  |.  68 5C804000   PUSH OFFSET 0040805C           ASCII "Registration successful !"
004012CD  \.  EB 0C         JMP SHORT 004012DB
004012CF  />  6A 00         PUSH 0
004012D1  |.  68 48804000   PUSH OFFSET 00408048           ASCII "CrackMe 2017 CTF v2"
004012D6  |>  68 40804000   PUSH OFFSET 00408040           ASCII "error !"

 0x01  判断输入值的长度

可以查看到我们输入后传入值的部分,并通过 strlen 来获取其长度是否为 4 ,不为 4 则直接跳转到 004012CF

现在可以确定key的长度为4

0x02 验证key前2位的值

这里验证key的值是否都为字符串“0”,如果4位的key又一个为“0”,则直接跳转到“error”弹出框

然后接着就是继续验证key前2位字符串的值,即给出字符串的前2位为“15”
如果 key 的前 2 位的值不为 “15” ,则直接跳转到 “error” 弹出框

这里得到前2为key的值为“15”

0x03 分析算法

这里运作流程:

1、取key中第3位的十六进制值,然后减去0x30,这里则假定值为a

2、取key中第1位值为“1”的十六进制值即0x31,然后减去0x30,0x31-0x30 =1

3、取key中第2位值为“5”的十六进制值即0x35,然后减去0x30,0x31-0x30 =5 ,接着就是1除以5得出浮点数0.2

4、取key中第4位的十六进制值,然后减去0x30,这里则假定值为b

5、接着就是(a-0.2)*b乘以16得出的结果为c

6、判断c与384是否相等,相等则Registration successful !,不相同则“error”
公式: (a-0.2)*b*16 = 384 求解 a 和 b
0x04 编写算法脚本

这里根据上面分析,写了个简单的脚本,跑出了 2 个结果 “151N” 和 "1555"

for i in range(126):for j in range(126):if(((i-48)-0.2)*(j-48) == 24):print(i)print(j)print("15"+"%s"%(chr(i))+"%s"%(chr(j)))print("------")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/114832.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车服务门店小程序模板制作指南

在数字化时代,一个小程序的力量不可忽视。它不仅是展示品牌形象和提供用户服务的重要工具,更是扩大客户群体和提高营收的关键手段。对于汽车服务门店来说,拥有一个精美且功能齐全的小程序,更将成为你在竞争激烈的市场中的重要武器…

终端登录github两种方式

第一种方式 添加token,Setting->Developer Setting 第二种方式SSH 用下面命令查看远程仓库格式 git remote -v 用下面命令更改远程仓库格式 git remote set-url origin gitgithub.com:用户名/仓库名.git 然后用下面命令生成新的SSH秘钥 ssh-keygen -t ed2…

1.Python操作txt文本

文章目录 1.Python读取一个txt文件的内容并将其写入到另一个txt文件2.Python读取一个未知编码的文件并将其设置为指定编码格式3.Python实现txt文件中字符串的替换 1.Python读取一个txt文件的内容并将其写入到另一个txt文件 # -*- encoding:gb2312 -*- import chardetdef read_…

Qt应用开发(基础篇)——日历 QCalendarWidget

一、前言 QCalendarWidget类继承于QWidget,是Qt设计用来让用户更直观的选择日期的窗口部件。 时间微调输入框 QCalendarWidget根据年份和月份初始化,程序员也通过提供公共函数去改变他们,默认日期为当前的系统时间,用户通过鼠标和…

indexDb使用

indexDb是什么? indexDb是除了cookie,localstorage,sessionstroage外的另一种前端存贮方式。 现有前端存贮比较 indexDb特点 无大小限制,适用于前端存贮数据较多场景存贮结构以对象仓库形式,可以存入任何类型数据&a…

无重叠区间【贪心算法】

无重叠区间 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 class Solution {public int eraseOverlapIntervals(int[][] intervals) {//先排序,按照左边界升序,注…

MySQL 数据库常用命令大全(详细)

文章目录 1. MySQL命令2. MySQL基础命令3. MySQL命令简介4. MySQL常用命令4.1 MySQL准备篇4.1.1 启动和停止MySQL服务4.1.2 修改MySQL账户密码4.1.3 MySQL的登陆和退出4.1.4 查看MySQL版本 4.2 DDL篇(数据定义)4.2.1 查询数据库4.2.2 创建数据库4.2.3 使…

接口自动化测试:mock server之Moco工具

什么是mock server mock:英文可以翻译为模仿的,mock server是我们用来解除依赖(耦合),假装实现的技术,比如说,前端需要使用某些api进行调试,但是服务端并没有开发完成这些api&#…

iOS import包

Frameworks Frameworks 顾名思义就是框架&#xff0c;是第三方打包完成看不到源码&#xff0c;可以直接使用的 在项目中引用方式 OC 引用某一个文件&#xff0c;Frameworks一般会提供一个h文件引用全部其他文件 #import <JLRoutes/JLRoutes.h>swift 引用一个包&#x…

vue使用qrcodejs2生成二维码

目录 概要 构建展示的vue组件qrcode.vue 组件的使用 概要 项目中用到需要展示二维码的样式&#xff0c;想到了qrcode 例如&#xff1a; 前提&#xff1a;安装包 npm install qrcodejs2 --save 构建展示的vue组件qrcode.vue <template><div style"width: …

JVM垃圾回收算法和CMS垃圾收集器

目录 判断一个对象是否死亡&#xff1f; 1、引用计数法 2、可达性分析算法 三色标记 垃圾收集算法 1、分代收集理论 2、垃圾回收算法 标记-清除 标记-复制 标记-整理 CMS&#xff08;Concurrent Mark Sweep&#xff09;收集器 CMS垃圾收集器步骤 CMS垃圾收集器优…

气传导耳机排名,四款市面上热销相当不错的气传导耳机推荐

​在当今快速的生活节奏中&#xff0c;气传导耳机成为了越来越多人的选择。它们以出色的音质和舒适度而广受好评。在本文中&#xff0c;我们将为您推荐四款市面上热销相当不错的气传导耳机&#xff0c;帮助你找到最适合自己的耳机。 推荐一&#xff1a;NANK南卡00压开放式耳机…

视觉化洞察:为什么我们需要数据可视化?

为什么我们需要数据可视化&#xff1f;这个问题在信息时代变得愈发重要。数据&#xff0c;如今已成为生活的一部分&#xff0c;我们每天都在产生大量的数据&#xff0c;从社交媒体到购物记录&#xff0c;从健康数据到工作表现&#xff0c;数据无处不在。然而&#xff0c;数据本…

基于RabbitMQ的模拟消息队列需求文档

文章目录 一、项目背景二、需求分析1.核心概念2.BrokerServer核心组件3.核心API4.交换机类型5.持久化6.网络通信7.消息应答 三、消息队列模块划分 一、项目背景 什么是消息队列&#xff1f; 消息队列就是&#xff0c;基于阻塞队列&#xff0c;封装成一个独立的服务器程序&#…

【Ubuntu】Ubuntu常用软件部署

1.安装jdk1.8 (1).apt方式安装 1).安装 1.在终端中输入以下命令&#xff0c;以更新软件包列表 sudo apt-get update2.在终端中输入以下命令&#xff0c;以安装JDK 1.8 sudo apt-get install openjdk-8-jdk3.将Java 1.8设置为默认版本。在终端中输入以下命令 sudo update-…

【Linux系列】使用虚拟机安装Linux系统

首发博客地址 首发博客地址[1] 系列文章地址[2] 下载虚拟机 请从官网下载&#xff1a; https://customerconnect.vmware.com/en/downloads/info/slug/desktop_end_user_computing/vmware_workstation_player/17_0 如需不限速下载&#xff0c;请关注【程序员朱永胜】并回复 1018…

微芯I/O控制器瞄准工业与嵌入式运算应用

微芯科技(Microchip Technology)日前发布SCH322X系列I/O控制器新品&#xff0c;该系列产品基于工业及嵌入式开发工程师的需求而开发&#xff0c;功能丰富且具高灵活性。新一代I/O控制器系列拥有尺寸更小的包装和更长的产品生命周期&#xff0c;可运用于更多经济型工业及嵌入式开…

Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末)

Android安卓实战项目&#xff08;12&#xff09;—关于身体分析&#xff0c;BMI计算&#xff0c;喝水提醒&#xff0c;食物卡路里计算APP【支持中英文切换】生活助手类APP&#xff08;源码在文末&#x1f415;&#x1f415;&#x1f415;&#xff09; 一.项目运行介绍 B站演示…

小兔鲜商03

进入可视区加载数据&#xff1a; 首页有很多模块&#xff0c;如果一次性加载所有数据&#xff0c;很卡&#xff0c;&#xff0c;当移动到要显示的地方&#xff0c;才加载数据 使用 vueuse 库中 useIntersectionObserver方法&#xff0c;&#xff0c; 传入要监听的元素 target …

Spring Boot存在路径遍历漏洞CVE-2021-22118

文章目录 0.前言1.参考文档2.基础介绍1. 影响的版本2. **漏洞利用原理&#xff1a;** 3.解决方案3.1. 方案13.2. 方案23. 方案3 0.前言 背景&#xff1a;Spring Boot存在路径遍历漏洞。CVE-2021-22118: 官方 issue也有对此的记录&#xff0c;感兴趣可以看下 https://github.com…