致梦的开始
前言
这篇文章是在第一学期快结束补充的,我不断地思索,哪个文章可以作为逆向启程呢,是ida的熟悉流程?是遇到最简单题目的题解?是c语言的小知识?亦或是其他,但我总认为,这些不足以为我的逆向开一个好头,思来想去最后决定以main函数来作为逆向的启蒙
start
开始,也意味着程序的开始,一个用c语言写好了main的程序并不是直接从main开始的,而是start,start紧接着去调用很多函数,他最终的目的也是位main铺路
以一个最简单的程序为例:
1 |
|
将这个程序生成的文件拖入ida
hello re
1 | // attributes: thunk |
反编译出的第一条是他,start,什么都没有,不过别急,点进去,连着点进去两个函数出现了第一个岔路
1 | __int64 sub_140011E30() |
这两个函数原本不叫这个,是我将其随意命名的,他在你的ida中可能会叫sub_地址,是ida给这个函数起的名字,选择road2点进去
1 | __int64 sub_140011E50() |
看到最后return Code了吗,记得一个main函数的基本框架有return 0吗,当时说0是返回值,返回程序是否正确运行,那么如果想要返回值0,返回到start那里,这一步返回的Code里面的值就应该是return的0,我们要去看Code在这个程序里那里被定义了——sub_1400120A0,在37行,所以说这个函数往里延伸的就是main函数,点进去
1 | __int64 sub_1400120A0() |
还是刚刚的原理,return返回的要是main里面返回的0,所以点开return后跟着的函数,一路到底
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
获得了主函数,如果到这里不是很明白的话,从最后一段代码的return 0,回到最初的start,观察一下,0是不是一直作为返回值被返回
终
逆向就是这样,总会有很多东西混淆你,谨记自己的初心,静下来,慢慢观察,最终你也可以从空白的的start抵达目标main