逆向破解和CTF基础,大学计算机技术大多是嵌入式或者是汇编课程才会学的到,想所学可以学习下软件逆向工程,wifi逆向工程,游戏逆向工程等方面,总之不太简单。

概念

徒手编写反汇编(成为顶级黑客--汇编与反汇编)(1)

c程序如何变成一个可执行程序

汇编:汇编语言是高级语言转换成机器码的桥梁,通过汇编语言的编译转换成机器码,计算机就可以执行程序。(.s 文件)

反编译:指把可执行程序(如*.exe或*.DLL)转化为汇编语言程序的过程。通过反汇编可以把你没有源代码的可执行程序变成可以阅读的汇编语言程序,你可以从中修改或找出它的运做过程,找出病毒的感染过程、藏身位置、发作条件等,用手工去除杀毒软件对付不了的病毒。(.o文件,windows是obj文件)

在这里可能会有疑问,就是为什么反编译.o文件而不是.elf,.exe,都是可以的。

#先总结下gcc用法,编译过程可以根据你使用的参数不同而省略步骤不同。 -x 设定文件所使用的语言, 使后缀名无效, 对以后的多个有效。 -c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 -S 只激活预处理和编译,就是指把文件编译成为汇编代码。 -E 只激活预处理,这个不生成文件, 你需要把它重定向到一个输出文件里面。 -o 制定目标名称, 默认的时候, gcc 编译出来的文件是 a.out

链接静态库(该库只有hello函数)生成的可执行文件反编译结果:

#分步骤编译: #1) 预处理 gcc -E test.c -o test.i #在当前目录下会多出一个预处理结果文件 test.i,打开 test.i 可以看到,在 test.c 的基础上把stdio.h和stdlib.h的内容插进去了。 #2)编译为汇编代码 gcc -S test.i -o test.s #其中-S参数是在编译完成后退出,-o为指定文件名。 #3) 汇编为目标文件 gcc -c test.s -o test.o #.o就是目标文件。目标文件与可执行文件类似,都是机器能够识别的可执行代码,但是由于还没有链接,结构会稍有不同。 #3) 链接并生成可执行文件 gcc test.o -o test #4)在linux下对利用反汇编器对.o文件进行反汇编。 objdump -d test.o

徒手编写反汇编(成为顶级黑客--汇编与反汇编)(2)

现在main中找静态链接库hello的位置,再跳转到hello的位置

链接动态库(该库只有hello函数)生成的可执行文件反编译结果,分三步查找:

#如果想加入链接库生成可执行文件: #静态链接库: #1) 编译生成目标文件 gcc -c struct.c #2)创建静态库 ar cqs libstruct.a struct.o #3)链接静态链接库,生成可执行文件 gcc main.c -static -L. -lstruct -o main #动态链接库: #1)编译成动态链接库 gcc struct.c -fPIC -shared -o libstruct.so #2)链接动态链接库,生成可执行文件 gcc main.c -L. -lstruct -o main #3)设置库文件的环境路径 #1)在bashrc或profile文件里用LD_LIBRARY_PATH定义,然后用source加载。 #2)把库路径添加到ld.so.conf文件中,然后用ldconfig加载。 #3)ldconfig /home/user/lib,仅能暂时性使用,若下次ldconfig时此目录下的动态链接库就不能被共享了。 #4)反编译可执行文件 objdump -D main > shard_obj.txt

徒手编写反汇编(成为顶级黑客--汇编与反汇编)(3)

找到动态库对应符号(hello)的位置

徒手编写反汇编(成为顶级黑客--汇编与反汇编)(4)

然后跳转到hello,执行权利交接

徒手编写反汇编(成为顶级黑客--汇编与反汇编)(5)

hello函数得以执行

参考了https://blog.csdn.net/eliot_shao/article/details/78648811有关内容

,