当前位置: 首页 > 编程日记 > 正文

看雪CTF 2016_第八题分析

用exeinfo查看发现是x64程序,所以用平常的OD调试器是调试不到的,需要用x64的调试器

我这里是用x64dbug 这个调试器来进行调试分析

经过一步一步调试,发现程序调用RtlMoveMemory 这个api来进行获取我们输入的注册码

Rax的内存地址即为我们输入的假码

我们先不要一步一步分析下去,直接来到提示注册码不正确那里。

我们来到上图的地方,走到000000013F5018E1 | E8 4E 8D 00 00 | call crackme.13F50A634 | 这里提示注册码不正确

然后上面有个跳转,为了验证是否为关键跳转,我们修改zf标志位使跳转成立,看看是不是提示成功,经过证实是提示成功,所以这个就是关键跳转。

然后我们看看它是使什么条件成立才跳转的呢。

000000013F5018A7 | 48 63 C6 | movsxd rax,esi |

000000013F5018AA | 49 63 D6 | movsxd rdx,r14d |

000000013F5018AD | 48 8D 0C 90 | lea rcx,qword ptr ds:[rax+rdx*4] |

000000013F5018B1 | 48 03 D1 | add rdx,rcx |

000000013F5018B4 | 48 8D 05 05 44 02 00 | lea rax,qword ptr ds:[13F525CC0] |

000000013F5018BB | 8B 0D 63 44 02 00 | mov ecx,dword ptr ds:[13F525D24] |

000000013F5018C1 | 0F AF CF | imul ecx,edi |

000000013F5018C4 | 03 0C 90 | add ecx,dword ptr ds:[rax+rdx*4] |

000000013F5018C7 | 8D 04 7F | lea eax,dword ptr ds:[rdi+rdi*2] |

000000013F5018CA | 3B C8 | cmp ecx,eax |

000000013F5018CC | 48 8D 0D A5 06 02 00 | lea rcx,qword ptr ds:[13F521F78] |

000000013F5018D3 | 74 07 | je crackme.13F5018DC |

这段汇编是对比ecx是否等于eax,如果等于就是为正确的注册码。

那么ecx的值和eax的值是怎么来的。

我们来分析一下:

movsxd rax,esi // esi=2

movsxd rdx,r14d //r14d=2

lea rcx,qword ptr ds:[rax+rdx*4] // [rax+rdx*4] 2+2*4=A

add rdx,rcx // rdx=A+2=C

lea rax,qword ptr ds:[13F525CC0] // [13F5B5CC0] =134

mov ecx,dword ptr ds:[13F525D24] // [13F5B5D24] =2=ecx

imul ecx,edi //这里的edi是个变量 我输入的假码是123456 所以这里edi=A678 ecx=2*A678=14cf0

add ecx,dword ptr ds:[rax+rdx*4] // dword [rax+rdx*4]=00000134 ecx=14cf0+134=14E24

lea eax,dword ptr ds:[rdi+rdi*2] // eax= [rdi+rdi*2]=A678+A678*2=1F368

所以很明显ecx = eax

上面的值除了变量之外,其余的都是固定的,你可以其他假码进行测试,我这里就不再举例了。

所以由上面得出:

edi X

2X+134=3X

X=134

所以只要变量等于134,就是正确的注册码,然而134是怎么计算出来的,即上面的edi=A678是怎么来的。

经过向上分析,我们得出edi的结果是下面这个call计算出来的

000000013F2D197B | E8 80 F9 FF FF | call crackme.13F2D1300 |

000000013F2D1980 | 85 C0 | test eax,eax |

000000013F2D1982 | 75 2B | jne crackme.13F2D19AF |

000000013F2D1984 | 48 8D 0D 8D 06 02 00 | lea rcx,qword ptr ds:[13F2F2018] |

我们进入这个call分析

000000013F921300 | 45 33 C9 | xor r9d,r9d |

000000013F921303 | 44 8B D9 | mov r11d,ecx |

000000013F921306 | 41 B8 01 00 00 00 | mov r8d,1 |

000000013F92130C | 45 8B D1 | mov r10d,r9d |

000000013F92130F | 81 F9 6A 03 00 00 | cmp ecx,36A | 和注册码对比 ecx为注册码

000000013F921315 | 75 04 | jne crackme.13F92131B |

000000013F921317 | 83 C8 FF | or eax,FFFFFFFF |

000000013F92131A | C3 | ret |

当前ecx=1E240 十进制是123456 是我刚才出入的假码 它和36A对比 36A十进制是874

这里不是很清楚为什么注册码不能为874,因为我这样分析在前面丢失了很多细节,不过没所谓,我们继续分析下去。

000000013F92131B | 81 F9 B1 68 DE 3A | cmp ecx,3ADE68B1 | 注册码和3ADE68B1 对比 十进制为987654321 即注册码不能是987654321

000000013F921321 | 74 F4 | je crackme.13F921317 |

000000013F921323 | 85 C9 | test ecx,ecx |

000000013F921325 | 75 09 | jne crackme.13F921330 |

000000013F921327 | 45 8B D0 | mov r10d,r8d |

000000013F92132A | EB 21 | jmp crackme.13F92134D |

下面这段是检测注册码长度是否少于1

000000013F921330 | B8 67 66 66 66 | mov eax,66666667 |

000000013F921335 | 41 FF C2 | inc r10d |

000000013F921338 | F7 E9 | imul ecx |

000000013F92133A | 8B CA | mov ecx,edx |

000000013F92133C | C1 F9 02 | sar ecx,2 |

000000013F92133F | 8B C1 | mov eax,ecx |

000000013F921341 | C1 E8 1F | shr eax,1F |

000000013F921344 | 03 C8 | add ecx,eax |

000000013F921346 | 75 E8 | jne crackme.13F921330 |

000000013F921348 | 45 3B D0 | cmp r10d,r8d | 检测注册码长度要大于1

000000013F92134B | 7C 13 | jl crackme.13F921360 |

循环计算出r8的值 后面用来进行运算 这里r8=F4240 十进制是 1000000

000000013F92134D | 41 8B C2 | mov eax,r10d | 输入的长度

000000013F921350 | 47 8D 04 80 | lea r8d,dword ptr ds:[r8+r8*4] |

000000013F921354 | 45 03 C0 | add r8d,r8d |

000000013F921357 | 48 83 E8 01 | sub rax,1 |

000000013F92135B | 75 F3 | jne crackme.13F921350 |

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

000000013F921360 | 41 FF C1 | inc r9d |

000000013F921363 | 41 8B C1 | mov eax,r9d |

000000013F921366 | 41 0F AF C1 | imul eax,r9d |

000000013F92136A | 99 | cdq |

000000013F92136B | 41 F7 F8 | idiv r8d |

000000013F92136E | 41 3B D3 | cmp edx,r11d | r11d等于输入的假码

000000013F921371 | 75 ED | jne crackme.13F921360 |

000000013F921373 | 41 8B C1 | mov eax,r9d |

000000013F921376 | C3 | ret |

这里就是计算出上面edi=A678 值的地方

用易语言是这么实现的

所以我们上面说到X=134就能得出正确的注册码,注意这里的134是十六进制,转换10进制是等于308

所以r9d=308时,eax=eax*eax 就是正确的注册码,计算得出注册码为:94864

文档和CM下载地址:http://www.vdisk.cn/down/index/19775196

转载于:https://www.cnblogs.com/Sendige/p/9601045.html

相关文章:

20169212 2016-2017-2 《网络攻防实践》第四周学习总结

20169212 2016-2017-2 《网络攻防实践》第四周学习总结 教材学习中的问题和解决过程 wireshark学习 主机:Kali ip:192.168.1.117 目标:www.bdwm.net 任务:捕获连接 www.bdwm.net的输入信息 利用wireshark可以清楚的看到发包的全过…

linux7挂载ntfs分区,刚安装centos7,请教大神如何挂载ntfs的分区

liangbenrang 于 2015-12-22 17:39:08发表:2、关于AS服务器Redhat5、6 CPU性能低问题,建议做如下调整:关于AS服务器Redhat5、6 CPU性能低问题,建议做如下调整:服务器BIOS设置(不同型号服务器设置方法不太一样):cpu关闭…

UIViewController、UINavigationController与UITabBarController的整合使用

UINavigationController与UITabBarController是iOS开发中最常用的两种视图控制器&#xff0c;它们都属于UIViewController的子类&#xff0c;继承关系如下&#xff1a; interface UITabBarController : UIViewController <UITabBarDelegate, NSCoding> interface UINav…

小学生正确使用计算机,小学生做数学作业用计算器的做法正确吗?为什么?

用计算器做数学题是一种偷懒的做题方法&#xff0c;不知道现在的数学课本上还有没有计算机教学这一章节的内容&#xff0c;学习使用计算器也是学习内容之内的&#xff0c;但是计算器是用来解决那些较复杂的数字运算的&#xff0c;基本的四则运算还是不要用计算器&#xff0c;尽…

【php】 PHP 支持 9 种原始数据类型

PHP 支持 9 种原始数据类型。 四种标量类型&#xff1a; boolean&#xff08;布尔型&#xff09;integer&#xff08;整型&#xff09;float&#xff08;浮点型&#xff0c;也称作 double)string&#xff08;字符串&#xff09;三种复合类型&#xff1a; array&#xff08;数组…

linux安装vsftpt服务,centos安装vsftp服务.md

# 使用nginx和vsftp搭建图片服务器并使用Java上传图片到该图片服务器## 安装vsftp1、首先&#xff0c;安装vsftpdshellyum -y install vsftpd复制代码2、验证是否安装成功shellrpm -qa vsftpd复制代码3、查看vsftp相关配置文件shellll /etc/vsftpd/复制代码vsftpd.conf文件是主…

android support v4、v7、v13

android support v4、v7、v13的区别及作用和用法 1, Android Support V4, V7, V13是什么? 本质上就是三个java library。 2, 为什么要有support库? 如果在低版本Android平台上开发一个应用程序,而应用程序又想使用高版本才拥有的功能,就需要使用Support 3, 三个Support 库的…

SimpleInjector 简单使用

SimpleInjector 简单使用&#xff0c;未完待续转载于:https://www.cnblogs.com/aresyl/p/6627372.html

win设置计算机网络,Win10怎么修改网络类型,Win10网络类型怎么设置?

Win10怎么修改网络类型,Win10网络类型怎么设置?对某件事物越是了解的深入&#xff0c;越是能发现产品的猫腻!比如Win10!因为产品性能没升级多少&#xff0c;但是马甲换的却非常勤快!可能有些朋友会感觉&#xff0c;下面的内容似曾相识。下面的Win10怎么修改网络类型的内容&…

GIL+死锁与递归锁+信号量+event事件

GIL全局解释器锁: GIL本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL,同一进程内的多个线程 必须抢到GIL之后才能使用Cpython解释器来执行自己的代码,即同一进程下的多个线程无法实现并行 但是可以实现并发 在Cpython解释器下,如果想实现并行可以开…

编程之法----面试和算法心得

第1章 字符串 1.1 字符串的旋转 输入一个英文句子&#xff0c;翻转句子中单词的顺序。要求单词内字符的顺序不变&#xff0c;句子中单词以空格符隔开。为简单起见&#xff0c;标点符号和普通字母一样处理。例如&#xff1a;若输入“I am a student.”&#xff0c;则输出“stude…

ios 消息通知

苹果的通知分为本地通知和远程通知&#xff0c;这里主要说的是远程通知 历史介绍 iOS 3 - 引入推送通知UIApplication 的 registerForRemoteNotificationTypes 与 UIApplicationDelegate 的 application(_:didRegisterForRemoteNotificationsWithDeviceToken:)&#xff0c;appl…

aml linux 环境,各位辛苦编译DSDT.aml的兄弟,linux是个好工具啊,简单提取

本小菜先后安装雪豹和lion&#xff0c;驱动一直不能完美解决。本想靠dsdt和idsdt大法驱动我的G310M显卡&#xff0c;可是困难重重。小本bios为phoenix&#xff0c;而非各位大神提供的ami和aword板&#xff0c;编译错误达到201处&#xff0c;更改rtc处编译剩余7处错误&#xff0…

华南理工网络计算机基础知识,2019年华南理工大学网络教育计算机基础随堂练习第一章...

2019年华南理工大学网络教育计算机基础随堂练习第一章 (9页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;11.90 积分&#xfeff;第一章 计算机基础知识第一节 计算机的基本概念随堂练习提交截止时间…

AFN 切换BaseUrl

在某个特定的接口需要修改baseurl时&#xff1a; 直接使用kvc&#xff1a; [_sessionManager setValue:[NSURL URLWithString:NEW_BASE_URL] forKey:"baseURL"];在发出请求后&#xff0c;在修改会通用的baseurl 转载于:https://www.cnblogs.com/liuwenqiang/p/960667…

按下开机键,计算机背后的故事

计算机是如何启动的&#xff1f; 从打开电源到开始操作&#xff0c;计算机的启动是一个非常复杂的过程。 我一直搞不清楚&#xff0c;这个过程到底是怎么回事&#xff0c;只看见屏幕快速滚动各种提示...…… 零、boot的含义 问&#xff1a;"启动"用英语怎么说&#…

android 图片缓存

一、Picasso https://github.com/square/picasso Picasso是Square公司开源的一个Android平台上的图片加载框架&#xff0c;简单易用&#xff0c;一句话搞定项目中的图片加载&#xff0c;好用到令人发指。 使用一句话&#xff1a;Picasso.with(this).load("url").plac…

linux shell cgi post,linux下shell处理cgi的方法--post get

web server获取网页上HTML的DOM对象信息发送来的信息&#xff0c;主要有get和post方法。介绍原理的文章很多&#xff0c;但介绍实际应用到linux的shell中的文章很少。1、get方法①表单源码如下&#xff0c;有几个HTML对象作为传值对象。CGI TestText fieldRadio button123②cgi…

福建工程学院计算机科学类投档线,2019年福建工程学院美术类本科专业投档分数线...

福建工程学院2019年美术类本科专业录取情况省份科类专业计划最高分最低分平均分江苏艺术综合环境设计5247.2241.2244.6视觉传达设计3244.2240241.8数字媒体艺术3247.2244.2246产品设计3243.8238.6241.1安徽艺术综合环境设计5728.7724.9726.9视觉传达设计4729726.5727.3数字媒体…

如何对正在运行的进程,进行heap profile

简单来说, 就是先preload上tcmalloc, 日常用用没啥问题, 当感觉出现问题时, gdb attach 上, 然后执行 call HeapProfilerStart("xxx") , 过一段时间, 再执行call HeapProfilerStop, 产出相应的profile文件, 然后detach出进程 以下为一些未整理的 link https://gperft…

linux 命令窗口美化,美化你的命令行终端Terminal

yuezhang.su 于 2009-05-13 18:20:47发表:太好了yuezhang.su 于 2009-05-13 18:20:47发表:太好了yuezhang.su 于 2009-05-13 18:20:47发表:太好了yuezhang.su 于 2009-05-13 18:20:46发表:太好了yuezhang.su 于 2009-05-13 18:20:46发表:太好了yuezhang.su 于 2009-05-13 18:20…

mac 显示隐藏文件

打开终端&#xff0c;输入&#xff1a;defaults write com.apple.finder AppleShowAllFiles -bool true 此命令显示隐藏文件defaults write com.apple.finder AppleShowAllFiles -bool false 此命令关闭显示隐藏文件命令运行之后需要重新加载Finder&#xff1a;快捷…

Android修改包名

1.直接Refactor ---> rename 2.修改build.gradle ---> applicationId 为新包名 3.修改后要注意XML中自定义控件的全名是否也改变了 参考&#xff1a;android studio 改包名转载于:https://www.cnblogs.com/jarvisyin/p/6634392.html

学计算机的好处处300字,学计算机的心得体会300字

学计算机的心得体会300字我们从一些事情上得到感悟后&#xff0c;可以寻思将其写进心得体会中&#xff0c;这么做可以让我们不断思考不断进步。那么好的心得体会都具备一些什么特点呢&#xff1f;以下是小编精心整理的学计算机的心得体会300字&#xff0c;欢迎大家分享。学计算…

洛谷 3519 bzoj 2213 Difference

联考考试考到了这个题&#xff0c;随机化40分&#xff0c;现在来秒掉它吧。 题意&#xff1a; 给一个字符串&#xff0c;求其中的一段&#xff0c;使得出现次数最多的字符与出现次数最少的字符的出现次数之差最大。 输入输出样例 输入样例#1&#xff1a; 复制 10 aabbaaabab 输…

linux 文件管理 教程,Linux文件管理

Linux文件管理本文介绍如何在Linux上创建文件、删除文件、复制文件、移动文件使用touch命令在linux上创建文件使用rm命令在linux上删除文件使用cp命令在linux上复制拷贝文件mv命令在linux上移动或重命名文件##文件简介Linux中文件可以分为普通文件、目录文件、链接文件、设备文…

ios cocopods 安装使用及高级教程

CocoaPods简介 每种语言发展到一个阶段&#xff0c;就会出现相应的依赖管理工具&#xff0c;例如Java语言的Maven&#xff0c;nodejs的npm。随着iOS开发者的增多&#xff0c;业界也出现了为iOS程序提供依赖管理的工具&#xff0c;它的名字叫做&#xff1a;CocoaPods。http://co…

单片微型计算机概念及组成,中国民用航空飞行学院2014年微机原理与接口考研复习大纲...

中国民用航空飞行学院硕士研究生入学考试801《微机原理与接口》复习大纲第一部分 考试说明一、 考试性质《微机原理与接口》是中国民用航空飞行学院硕士生入学考试科目之一。它的评价标准是高等学校、科研院所的优秀本科毕业生能达到及格以上水平&#xff0c;以保证被录取者具…

【转】Jmeter常见问题

收集工作中JMeter遇到的各种问题1. JMeter的工作原理是什么&#xff1f;向服务器提交请求&#xff1b;从服务器取回请求返回的结果。2. JMeter的作用&#xff1f;JMeter可以用于测试静态或者动态资源的性能&#xff08;文件、Servlets、Perl脚本、java对象、数据库和查询、ft…

linux的tar中ztvf,linux中的tar命令(2)

实例4&#xff1a;只将 /tar 内的 部分文件解压出来命令&#xff1a;tar -zxvf /opt/soft/test/log30.tar.gz log2013.log输出&#xff1a;[rootlocalhost test]# tar -zcvf log30.tar.gz log2012.log log2013.loglog2012.loglog2013.log[rootlocalhost test]# ls -al log30.ta…