汇编学习&&nasm使用&&调试

前言

为了更好的做逆向,刚学了点汇编的知识,尽管在我们微机课上也会有教,但总有时会分心。而且,这些不自己实际操作下也是搞不懂的。

尽管在这之前我已近玩过一些逆向了,但更多的是单步调试,通过ida、OD等强大的功能飘过,一些细节并不清楚。所以必须要系统地学习汇编的知识。

这里我选择的书是王爽的《汇编语言(第三版)》,虽然这书讲的是8086的16位的汇编(啊喂,太过时了吧!),不过基本原理都是差不多的,既然那么多人推荐我也就不浪费时间在选择书上了。

环境选择

在王爽的书中,他教学使用的是masm,即是微软开发的汇编开发环境,然后通过dos下的debug来调试。

然而,debug这个调试器早在win7时已经没加入到windows系统中了

对于这个程序,描述是

​ DOS Debug is an improved MS-DOS DEBUG command. There are two binaries available: the small and simple DEBUG.COM, which can debug DOS 16-bit real-mode applications only and DEBUGX.COM, which additionally can debug protected-mode DPMI applications, both 16-bit and 32-bit

嗯……只能调试实模式下16位的程序和保护模式下16位、32位的程序……所以,要你何用!

然后就是masm了,masm只能在windows下用呀……而且看着感觉会略老旧(事实上微软是继续支持发展这个产品的),反正就是看着不想用。

这时我看到了nasm,这个一款基于80x86和x86-64平台的汇编语言编译程序,其设计初衷是为了实现编译器程序跨平台和模块化的特性。所以各平台都兼容的很好呀!关键是,他支持多种系统版本系统的文件生成,语法上还比masm简单……

以下是其支持输出的文件格式outputFile

关键我还不用往我windows下装软件,我直接在Ubuntu上apt-get install nasm就好了!

使用nasm

首先我找了这么一段汇编代码,效果是输出Hello world!

1
2
3
4
5
6
7
8
9
10
11
12
section .text                                                                                                                                   
global main
main:
mov eax,4;
mov ebx,1;
mov ecx,message;
mov edx,14;
int 80h;
mov eax,1;
int 80h;
message:
db "Hello world!",0ah,0dh

跟masm语法有点不一样,在masm定义段还有XXX segment...XXX ends assume cs:XXX...end

而在这只需要一个section .text,意思我还不太懂。这里定义的global main即在汇编中定义的main函数。

nasm我测试了这几条命令,感觉常用也就这个组合了。

nasm -f elf32 test.asm -o test.o %生成32位elf的.o文件

nasm -f win32 test.asm -o test32.o %生成32位windows的.o文件

nasm -f win64 test.asm -o test64.o %生成64位windows的.o文件

通过file查看输出格式 fileType

这里很奇怪的是test64.o是data,看来是没有识别出来。

然后就可以通过gcc -m32 test.o -o test生成可执行文件test了(这里-m32是gcc在64位系统编译32位文件需要加的参数)

op

事实上这里gcc是起到一个链接器的作用,查阅得,所谓的gcc叫做gcc工具链,这个工具链包括很多工具,其中用于链接的叫做ld.用 gcc链接时会根据选项不同调用不同的工具,如果到了链接阶段就会调用ld这个工具。所以事实上这里要用ld这个工具呀。

调试演示

然后就是调试了,抛弃了debug这个陈旧的东西,我们还有很多强大的调试器选择

例如win下的OllyDbg、IDA PRO,还有gdb

这里gdb推荐github上的一个配置文件peda,这个配置文件很强大,不需要另外装别的插件,似乎是玩pwn的好工具啊。

gdb调试

Ubuntu15.10-2016-11-06-23-34-49

然后我把那两个win下的.o文件拖到windows下同样原理用gcc编译了一下,并用OD和IDA调试

IDA

这里只用IDA演示调试64位的ida

OllyDbg

OD调试的是32位的

OD

总结

看起来很简单,但实际上还是遇到好多问题的,这里总结一下

  1. 通过.asm编译出来的.o文件必须要通过链接器生成可执行文件,这里链接器实际上用的是ld,gcc只是提供了一个工具的入口。
  2. 在64位的系统下链接生成32位的程序需要加-m32 (gcc)参数或 -mi386pe (ld on win)的参数。
  3. 在windows下用gcc链接可能会出现各种奇怪的错误,例如找不到msvcrt.dll文件(然而我确定过我电脑有……)(至少我在我的64位win下用gcc链接32位.o是没成功)
  4. 因为我上面汇编代码没有改过,在windows下中断指令不是int 80h,所以事实上上面编译生成的可执行文件在windows下运行时是崩溃的。
  5. 因为我才刚看怎么写汇编,上面汇编代码是我从网上找的,对于nasm的一些语法并不清楚,所以上面的代码可能极其极其不规范!做参考的话请谨慎~

蜜汁觉得思路清晰了很多呢

×

赞助gif换电脑、吃双皮奶(逃

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 前言
  2. 2. 环境选择
  3. 3. 使用nasm
  4. 4. 调试演示
    1. 4.0.1. gdb调试
    2. 4.0.2. IDA
    3. 4.0.3. OllyDbg
  • 5. 总结
  • ,