[Reverse] - 百度杯”CTF比赛 2017 二月场-CrackMe-1

环境:Windows XP

工具:
IDA
OD
EXEINFOPE

0x00 查壳

这里写图片描述

0x01 分析

拖入OD,字符串查找看一看。
这里写图片描述

跟进去看就可以知道关键call了

0040196A   .  48            dec eax
0040196B   .  0F85 C4000000 jnz CrackMe1.00401A35
00401971   .  B8 E8030000   mov eax,0x3E8                            ;  Case 111 (WM_COMMAND) of switch 00401956
00401976   .  66:3945 10    cmp word ptr ss:[ebp+0x10],ax
0040197A   .  0F85 B5000000 jnz CrackMe1.00401A35
00401980   .  8B4D 08       mov ecx,dword ptr ss:[ebp+0x8]
00401983   .  E8 88F8FFFF   call CrackMe1.00401210                   ;  返回值要为0x2EF
00401988   .  3D 29090000   cmp eax,0x929                            ;  Switch (cases 168..1435)
0040198D   .  7F 54         jg XCrackMe1.004019E3
0040198F   .  74 3A         je XCrackMe1.004019CB
00401991   .  3D 68010000   cmp eax,0x168
00401996   .  74 23         je XCrackMe1.004019BB
00401998   .  3D EF020000   cmp eax,0x2EF
0040199D   .  0F85 92000000 jnz CrackMe1.00401A35
004019A3   .  6A 00         push 0x0                                 ; /Style = MB_OK|MB_APPLMODAL; Case 2EF of switch 00401988
004019A5   .  68 0CFD4000   push CrackMe1.0040FD0C                   ; |Title = "CrackMe"
004019AA   .  68 14FD4000   push CrackMe1.0040FD14                   ; |Text = "This is Flag!"
004019AF   .  6A 00         push 0x0                                 ; |hOwner = NULL
004019B1   .  FF15 08C14000 call dword ptr ds:[<&USER32.MessageBoxA>>; \MessageBoxA

00401983跟进去,翻到后面有个这个:

00401267   .  68 402E4100   push CrackMe1.00412E40                   ; /pStartupinfo = CrackMe1.00412E40
0040126C   .  FF15 28C04000 call dword ptr ds:[<&KERNEL32.GetStartup>; \GetStartupInfoA
00401272   .  833D 502E4100>cmp dword ptr ds:[0x412E50],0x0
00401279      0F85 6D060000 jnz CrackMe1.004018EC
0040127F   .  833D 542E4100>cmp dword ptr ds:[0x412E54],0x0
00401286      0F85 60060000 jnz CrackMe1.004018EC
0040128C   .  833D 602E4100>cmp dword ptr ds:[0x412E60],0x0
00401293      0F85 53060000 jnz CrackMe1.004018EC
00401299   .  833D 642E4100>cmp dword ptr ds:[0x412E64],0x0
004012A0   .  0F85 46060000 jnz CrackMe1.004018EC
004012A6   .  833D 682E4100>cmp dword ptr ds:[0x412E68],0x0
004012AD   .  0F85 39060000 jnz CrackMe1.004018EC
004012B3   .  833D 582E4100>cmp dword ptr ds:[0x412E58],0x0
004012BA   .  0F85 2C060000 jnz CrackMe1.004018EC
004012C0   .  833D 5C2E4100>cmp dword ptr ds:[0x412E5C],0x0
004012C7   .  0F85 1F060000 jnz CrackMe1.004018EC
004012CD   .  F605 6C2E4100>test byte ptr ds:[0x412E6C],0x80
004012D4   .  0F85 12060000 jnz CrackMe1.004018EC

判断STARTUPINFO信息来反调试。

规定输入内容的长度

0040133E   .  8D041B        lea eax,dword ptr ds:[ebx+ebx]
00401341   .  3BC1          cmp eax,ecx
00401343   .^ 75 B2         jnz XCrackMe1.004012F7

规定输入内容的字符的范围

00401370   > /8A8414 840000>mov al,byte ptr ss:[esp+edx+0x84]
00401377   . |3C 41         cmp al,0x41
00401379   . |7C 04         jl XCrackMe1.0040137F
0040137B   . |3C 46         cmp al,0x46
0040137D   . |7E 10         jle XCrackMe1.0040138F
0040137F   > |3C 30         cmp al,0x30
00401381   .^|0F8C 70FFFFFF jl CrackMe1.004012F7
00401387   . |3C 39         cmp al,0x39
00401389   .^|0F8F 68FFFFFF jg CrackMe1.004012F7
0040138F   > |42            inc edx
00401390   . |3BD1          cmp edx,ecx
00401392   .^\7C DC         jl XCrackMe1.00401370                    ;  规定只能是数字和大写字母

然后是核心算法的内容了,最后面这里就是比较内容决定是否是正确了:

 004018A0   > /8B840C AC0000>mov eax,dword ptr ss:[esp+ecx+0xAC]
004018A7   . |3B840C D40000>cmp eax,dword ptr ss:[esp+ecx+0xD4]
004018AE   . |75 22         jnz XCrackMe1.004018D2                   ;  这里不能跳
004018B0   . |83C1 04       add ecx,0x4
004018B3   . |83F9 28       cmp ecx,0x28
004018B6   .^\7C E8         jl XCrackMe1.004018A0

这是是填入内容的语句

00401767   .  88BC0C AC0000>mov byte ptr ss:[esp+ecx+0xAC],bh
0040187F   .  888414 D40000>mov byte ptr ss:[esp+edx+0xD4],al

IDA分析一下就知道,其实两个算法是一样的,只是换了个变量名。

0x02 结果

算法过程感觉很复杂,就没有用代码实现一遍了。

方法一:爆破

ABCDEF1234567890ABABCDEF1234567890AB
0012FA5C  3C 81 64 30 E8 EE 0A 90 20 1B 46 52 C8 20 FE D4  <0.?FR?0012FA6C  8C FE 00 00 00 00 00 00 00 00 00 00 00 00 00 00..............
0012FA7C  00 00 00 00 00 00 00 00 B4 0A C0 6D AB 59 97 1F  ........?續玒?
0012FA8C  B4 B4 0A C0 6D AB 59 97 1F B4 00 00 00 00 00 00.續玒??.....
0012FA9C  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ACADAEAFBABBBCBDBEBFCACBCDCECFDADBDC
0012FA5C  3C 81 64 30 E8 EE 0A 90 20 1B 46 52 C8 20 FE D4  <0.?FR?0012FA6C  8C FE 00 00 00 00 00 00 00 00 00 00 00 00 00 00..............
0012FA7C  00 00 00 00 00 00 00 00 73 EA 21 80 C5 24 E3 5A  ........s??0012FA8C  D1 F0 F5 D4 0A C1 20 E5 44 03 00 00 00 00 00 00  佯踉.?......
0012FA9C  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

这样的话基本上就可以看出输入的每两个字符组成16进制,通过一定的映射关系,映射到对应的值,而且每两个字符之间互不影响。这样的话就可以列举0x00-0xFF所有值,找到每个值的映射关系,制成一张表,就可以通过查表来看出

3C 81 64 30 E8 EE 0A 90 20 1B 46 52 C8 20 FE D4 8C FE

对应什么字符串了。

方法二:追码
刚刚也有提到,两个算法是一样的

00401649   .  E8 B2F9FFFF   call CrackMe1.00401000                   ;  下面是开始两个算法
0040164E   .  8B4C24 34     mov ecx,dword ptr ss:[esp+0x34]
00401652   .  33D2          xor edx,edx
00401654   .  895424 20     mov dword ptr ss:[esp+0x20],edx
00401658   .  895424 24     mov dword ptr ss:[esp+0x24],edx
0040165C   .  894C24 1C     mov dword ptr ss:[esp+0x1C],ecx
00401660   >  8A21          mov ah,byte ptr ds:[ecx]                 ;  这里的al是输入的内容
00401662   .  895424 10     mov dword ptr ss:[esp+0x10],edx          ;  bh就是上面的算法计算出来的

这样的话就可以在00401649处的call下断点,查看BH的值,就可以得知要输入的字符串是什么了。

得到:
838EFBFFE7D9CDDFCFC4C1C5C7CFC9CBB3C9

在i春秋里提交:
flag{838EFBFFE7D9CDDFCFC4C1C5C7CFC9CBB3C9}

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

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

相关文章

【DeepLearning】Exercise:Learning color features with Sparse Autoencoders

Exercise:Learning color features with Sparse Autoencoders 习题链接&#xff1a;Exercise:Learning color features with Sparse Autoencoders sparseAutoencoderLinearCost.m function [cost,grad,features] sparseAutoencoderLinearCost(theta, visibleSize, hiddenSize,…

win7 64位系统下 PL/SQL无法连接的问题

第一步&#xff1a;下载oracle客户端 由于 PLSQL Developer 没有64位版本&#xff0c;所以在64位系统上运行该程链接64位Oracle时就会报错&#xff0c;笔者为这个问题纠结了好几天&#xff0c;后来通过请教Google 动手实践&#xff0c;终于搞定了这个问题。现在把笔者解决的过…

2016腾讯安全挑战赛第一轮-PC游戏方向

0x00 查壳 无壳的VC程序 0x01 测试 没有消息弹窗&#xff0c;尝试对函数下断点。 OD载入后&#xff0c;CtrlN查找函数&#xff0c;找到GetDlgItem 程序运行起来&#xff0c;等输入完后点击确定后程序断下。一路F8就来到这里 00401EED . E8 6A5B0000 call Tenc…

JavascriptDOM(三)

简介 今天学习第二天的知识,js和BOM对象,再接再厉,fighting~学习原则 脚踏实地的走好每一步,要想学好高级部分,基础知识必须扎实呀 掌握基本语法,完成小案例,写博客作总结,基本就是这个节奏,下面我们一起快速入门吧JavaScript快速入门 1. js简介 1.js基于对象和事件驱动的脚本语…

看雪 2016CrackMe 攻防大赛 - 1-Crack_Me-凉飕飕

环境&#xff1a; Windows xp 工具&#xff1a; IDA EXEINFOPE OD 0x00 查壳 EXEINFOPE查壳&#xff0c; 无壳 0x01 分析 if ( (unsigned __int16)wParam 0x40B ) // 成功{*(_OWORD *)v22 xmmword_41DB98;v25 0;v23 xmmword_41DBA8;v24 xmmword_41DBB8;memset_4039D0…

使用CSDN-markdown编辑器

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

C++ vector类详解

转自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器&#xff0c;它是一种顺序容器&#xff0c;支持随机访问。vector是一块连续分配的内存&#xff0c;从数据安排的角度来讲&#xff0c;和数组极其相似&#xff0c;不同的地方就是…

ViewPager的使用方法和实现过程

看图先&#xff1a; 页面中填充内容是随机关键词飞入和飞出动画效果&#xff0c;随后会更新&#xff0c;现在请先无视吧 首先是 导入jar包 下载地址&#xff1a; android-support-v4.jar 布局文件里添加viewPager布局 [html] view plaincopyprint?<android.support.v4.vi…

如何通过浏览器在所有响应内容中查找文本

使用浏览器的开发者工具查找响应文件的内容 ** Chrome ** 版本&#xff1a; 快捷键&#xff1a;CtrlShiftF 可以看到已经查找出来了 ** firefox ** 版本

【Leetcode】【Easy】Implement strStr()

Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. 解题&#xff1a; 本题为典型的KMP算法考察题&#xff0c;KMP算法描述为&#xff1a; 设主串S&#xff0c;匹配串P&#xff0c;i为S的索引下…

Jenkins入门指南

新手学习使用Jenkins 安装好Jenkins后如何运行脚本 1.新建item 2.输入任务名称&#xff0c;选择项目类型&#xff0c;点击确定 3.填个描述就好了&#xff0c;新手学jenkins&#xff0c;其他都不看&#xff0c;跑起来再说 4.点这个高级&#xff0c;选择你要运行的脚本所在…

Sublime Text 3 史上最性感的编辑器

↑ ↑ ↑ ↑ ↑ 请看文件夹 ↑ ↑ ↑ ↑ ↑ 下载 / 安装 windows / MAC OS 官网下载&#xff0c;双击安装&#xff0c;这个都会吧&#xff5e; linux linux下安装&#xff0c;一种办法是从官网下载 tar.bz &#xff0c;手动安装。 这里介绍用 apt-get 自己主动安装方法&#xf…

swift入门之TableView

IOS8更新了&#xff0c;oc还将继续但新增了swift语言&#xff0c;能够代替oc编写ios应用&#xff0c;本文将使用swift作为编写语言&#xff0c;为大家提供step by step的教程。 工具 ios每次更新都须要更新xcode&#xff0c;这次也不例外&#xff0c;但使用xcode6&#xff0c;须…

Jmeter BeanShell学习(一) - BeanShell取样器(一)

通过利用BeanShell取样器设置请求发送的参数。 第一步&#xff1a;添加BeanShell取样器 第二步&#xff1a;在BeanShell中输入执行的代码 log.info("脚本开始执行"); //意思是将字符串输出到日志消息中 vars.put("username","123163.com");//…

Jmeter BeanShell学习(一) - BeanShell取样器(二)

利用BeanShell取样器获取接口返回的JSON格式的结果&#xff0c;并将该结果写入到文件。 第一步&#xff1a;添加BeanShell取样器 前面几个取样器的内容查看&#xff1a; https://blog.csdn.net/goodnameused/article/details/96985514 第二步&#xff1a;查看返回的结果格式 …

160 - 50 DueList.5

环境&#xff1a; Windows xp sp3 工具&#xff1a; Ollydbg exeinfope 0x00 查壳 可以看出程序有加壳&#xff0c;那么我们下一步就是脱壳了。 0x01 脱壳 看上去没什么特别的地方&#xff0c;就直接 单步跟踪法 来脱壳吧 近call F7&#xff0c;远call F8 来到这里 哈&…

关键路径的概念和算法

AOE网&#xff1a;在一个表示工程的带权有向图中&#xff0c;用顶点表示事件&#xff0c;用有向边表示活动&#xff0c;边上的权值表示活动的持续时间&#xff0c;称这样的有向图叫做边表示活动的网&#xff0c;简称AOE网。AOE网中没有入边的顶点称为始点&#xff08;或源点&am…

160 - 51 DueList.6

环境&#xff1a; Windows xp sp3 工具&#xff1a; Ollydbg exeinfope 0x00 查壳 发现程序没有加壳&#xff0c;那么我们可以直接分析了。 0x01 分析 运行程序看一看 看到错误信息的字符串后我们可以直接搜索了。 可以看到程序会比较输入的长度是否为8位&#xff0c;如…

160 - 52 egis.1

环境&#xff1a;windows xp 工具&#xff1a; 1、OllyDBG 2、exeinfo 3、IDA 0x00 查壳 加了UPX壳&#xff0c;那么就要脱壳了。可以使用单步法来脱壳。 UPX壳还是比较简单的&#xff0c;开头pushad&#xff0c;找个popad&#xff0c;然后就是jmp了。 然后就可以用OD来…

玩转MySQL之Linux下的简单操作(服务启动与关闭、启动与关闭、查看版本)

小弟今天记录一下在Linux系统下面的MySQL的简单使用&#xff0c;如下&#xff1a; 服务启动与关闭 启动与关闭 查看版本 环境 Linux版本&#xff1a;centeros 6.6&#xff08;下面演示&#xff09;&#xff0c;Ubuntu 12.04&#xff08;参见文章末尾红色标注字体&#xff09; M…