<>[逆向入门] 逆向分析Hello World 程序
<>0X00 前言
时隔一个月,在看完了汇编,正式进入逆向学习之后,我终于想起了更新我的博客。最近在看《逆向工程核心原理》(李承远 著),开头介绍了一个关于Hello
World程序的逆向分析。感觉挺有意思的,就让逆向与更新也从Hello World开始吧。
我的目标是通过打补丁将显示结果改为“Hello CiSuKid!”
<>0X01 写个Hello World
一个简单的C程序,我用的编译器是Dev-C++ 5.4.0,使用不同编译器得到的应用程序文件可能在后续OD的窗口中得到不同的汇编代码。
代码如下:
#include <stdio.h> int main(){ printf ("Hello world!!"); return 0; }
编译成功,得到一个美妙的Hello world小程序,下面开搞。
<>0X02 开搞
拖进OD,先运行一波:
正常操作。
入点附近的代码和我们要做的事关系不大,欣赏欣赏就好,等我日后有需要在研究。
现在的主要目标是找到main中的printf函数。
因为已经知道回显是个“Hello world!!”,咱可以试着查查字符。
右击–中文搜索引擎–搜索ASCⅡ(对,我用的中文版OD,有的编译器可能默认UNICODE,在不了解的时候可以都试试。)
发现了一个美丽的Hello world!!,双击它。跟踪画面如下:
不难看到标准的栈帧以及对printf函数的调用,我认为图中004013B0即为main函数的入口。
F2下个断点,F9运行到这。
此时注意寄存器与栈内的情况,F8逐条执行。
观察图中004013BE处代码可知,程序从内存00403064处调取"Hello world!!"字符用于后续调用printf函数时输出到显示屏上。
从数据窗口Ctrl+G访问内存00403064处,得到画面如下:
此时只需用Ctrl+E将调用的这一段字符改成“Hello
CiSuKid!”即可(字符长度尽量不要占用到后面的非0数据,且需保留至少两个字节的0数据),操作如下:
接下来继续运行,即可得到约定的输出结果,如下:
到这里,我的目的就达到了。
<>0X03 总结
实际上仅仅经过以上步骤,该应用程序在退出OD后运行结果依然还会是“Hello world!!”。
如果想使应用程序发生改变,可以选中下图中的修改后的数据。
右击–复制到可执行文件,并在弹出窗口中右击保存文件即可得到一个打补丁的Hello world 应用程序。
但是由于我程序设计的问题,导致在非调试时运行,会一闪而过无法看到改变的输出,下次设计类似程序时可以加个getchar();
吾爱破解的账号,ID:CiSuKid Have a good time!
技术
今日推荐