逆向入门--第一次的HelloWorld
终于算是慢慢的爬入了逆向的大门,梦想虽远,坚持就好
记第一次简单的逆向过程
首先贴出CrackMe的源码,很简单的一个if而已
#include <stdio.h>
#inclued <stdlib.h>int main(int argc, char **argv)
{ char passWord[8] = {"pass"};char word[8] ;gets(word);if(strncmp(passWord, word, 8) == 0){printf("authorized !\n");}return 0;
}
代码很简单,输对了就打印
(当然这个还存在缓冲区溢出,这个后面讲)
开始Crack
因为我们的EXE文件是标准的PE( Portable Executable )
所以我们使用IDA(静态分析调试工具)对文件进行查看
IDA 相当与我们的地图一样的作用
这个就是我们的IDA 加载之后的程序 ,当然是汇编,的形式
第一行可以看到,是main的入口
很多人都是认为程序是从main函数开始 的,其实不然,程序真正的入口我们称之为OEP(original entry point)
然后我们向下读代码,
30 地址之前的就是我们的变量地址分配,
ebp,exp也就是我们常提起的bp 和 sp 的extend版本
31到36是我们的栈初始化
- 30 基址压栈
- 31 基址赋值
- 33 对栈指针做掩码??(没弄懂这个作用)
- 36 对栈顶指针做减法,即分配栈空间 20*16 个字节
- 39 call _main (这里才是真正的进入了main函数中去)
39往后main里
- 3E 就是变量赋值 可以看到 str1的值是 -8h (这里就很好解释了栈地址是如何向低地址增长的),后面的字符串当时我还没反应过来,其实是端序的问题,在Win里 都是大端格式,所以向下增长 的时候字符串要反过来
- 46 这里就是对字符串后面添加 \0 作为结束符
- 4E ~52 原理同上分配buffer(IDA已经自动注释,美哉)
- 55 就是调用我们的gets函数
- 5A~6E 就是strncmp的参数配置,str1 str2 maxcount这三个
- 71 调用strncmp函数
76 这个比较重要 这里的显然是不改变eax的值的,那么他的作用是什么呢? 就是设置flag寄存器的状态
test 的作用不同于 cmp ,cmp 相当于算数相减,而test 是逻辑相与
所以这里只有eax为0h的时候 才会出现 设置Z位为1
- 78这里就是我们核心的一句! jnz就是不为零就调转,而下面就是我们的puts 得到的函数,所以要想成功破解,这里的就必须不能跳转!
- 7A 字符串压栈,
- 81 打印
- 86~8B 就是我们的return 0了
eax 默认的就是传递的第一个参数
到此程序的静态解读告一段落
下面就是我们使用ollydbg进行动态调试,或者直接使用UE对pe文件进行修改(直接改jnz的汇编码即可) Ollydbg: ![这里写图片描述](https://img-blog.csdn.net/20170901001708367?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveno3MDkxOTY0ODQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) (2333 ollydbg 看着还是挺帅的) 这里的地址,可以在ida里面找到; 下面就是修改那个jnz了,反正什么都行
- jz 刚好相反
- nop 啥都不动向下执行
那就Nop吧 随便改一改
可见我们的authorized已经打印出来了
本次简单逆向也是告一段落了
附加
下面附件一点:
* 缓冲区溢出问题*
因为上面刚刚好有汇编的代码,这样解释起来就是变得简单了
可以看到,栈的空间分配是连续的,所以我的缓冲区给的大小是8 那么这样的话,他地址会基于栈地址来减去八个字节,然而,gets() 函数是不会判断缓冲区大小的,所以会把我们的输入直接写到地址。
所以,漏洞就产生了,
str1,str2 是地址连续的两个8字节的空间,那么我们只要输入一个16字节对称的字符串,就可以完美绕过!
效果如上!
写在最后的话
送给大家一句话吧: 鸿鹄志高而难酬,终而还是妥协泯然众人
“”小镇青年何必远方?“” 于是我走出了这个熟悉的地方
逆向入门--第一次的HelloWorld相关推荐
- 010 Android之逆向入门
文章目录 Android APK文件结构 META-INF res AndroidManifest.xml classes.dex resources.arsc lib Assets Android ...
- SO逆向入门实战教程一:OASIS
文章目录 一.前言 二.准备 三.Unidbg模拟执行 四.ExAndroidNativeEmu 模拟执行 五.算法分析 六.尾声 一.前言 这是SO逆向入门实战教程的第一篇,总共会有十三篇,十三个实 ...
- java jni helloword_JNI入门教程之HelloWorld篇
JNI入门教程之HelloWorld篇 来源:互联网 宽屏版 评论 2008-05-31 09:07:11 本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第 ...
- 【Data URL】【RE】【bugku】逆向入门writeup
在写wp之前先来了解一下Data URL是什么 Data URL 在浏览器向服务端发送请求来引用资源时,一般浏览器都有同一时间并发请求数不超过4个的限制.所以如果一个网页需要引用大量的服务端资源,就会 ...
- [BUGKU] [REVERSE] 逆向入门
[BUGKU] [REVERSE] 逆向入门 例行PEID查壳,发现不是有效的PE文件 winhex打开 data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA ...
- 攻防世界逆向入门题之open-source
攻防世界逆向入门题之open-source 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向入门题的open-source 下载附件得到源码: #include <stdio.h> #in ...
- 攻防世界逆向入门题之流浪者
攻防世界逆向入门题之流浪者 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向入门题的流浪者 下载附件,照例扔入exeinfope中查看信息: 32位PE文件无壳,照例扔入ida32中查看伪代码: 是没 ...
- JNI入门学程之HelloWorld篇
如果你对Jni不甚懂得,不晓得Jni是作什么的,如何树立一个基础的jni程序,或允许以参考下面下面这些文章: 应用VC++6.0实现JNI的最简单的例子 JNI入门学程之HelloWorld篇 SUN ...
- 攻防世界逆向入门题之no-strings-attached
攻防世界逆向入门题之no-strings-attached 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向入门题的no-strings-attached 下载附件: 扔入Exepeinfo中查壳和其 ...
最新文章
- Python培训分享:Python发展前景怎么样?
- 1080解析 芒果tv_国内主流视频平台解析下载观看
- 好文推荐 | 缓存与数据库一致性问题深度剖析 (修订)
- POJ 1287 Prim算法模板
- 微软将推出桌面虚拟化软件
- ECSHOP 订单状态 记录
- SpringBoot基础篇日志管理之默认配置
- Python入门基础学习记录(二)汇率案例学习记录
- 我发起了一个 .Net Core 平台上的 分布式缓存 开源项目 ShareMemory 用于 取代 Redis...
- 拟合函数、曲线拟合有这个网站足够了
- 基于 Flink、ClickHouse 的舆情分析系统:系统详细设计说明书
- 社交网络分析——影响力最大化(附带python例子实现)
- python卸载清理注册表_使用Python操作注册表
- 2020.7.25 PAT甲级7-2 The Judger (25分)
- bootstrap typeahead实现模糊查询功能
- 趣味测试类微信小程序
- 30天自制操作系统(day10)
- 对于20+想转行程序员但非常迷茫的人的一些建议
- 51nod1462 树据结构
- Netty框架之Selector使用详解