汇编语言学习笔记——3

汇编语言学习[2018-05-09],第 3 天

简单的汇编程序

汇编程序有各块组成,常用的3个块如下

  • The data section
  • The bss section
  • The text section

The data section

带初始化值数据块,可定义在程序块的后面,最好是定义在程序的最前面,方便阅读和维护,对于汇编程序是可选块

The bss section

不带初始化值数据库,必须定义在程序块前面,通常用于缓冲区定义,对于汇编程序是可选块

The text section

程序块,对于汇编程序是必选块

定义块

``` 汇编代码
.section .data
.section .bss
.section .text
```

汇编语言的main函数

汇编语言的程序执行入口只有_start标记,相对于java或c中的main函数,也可以将_start标记替换成main标记,在程序编译连接时,使用ld -emain来指定程序入口

汇编程序hello word

``` 汇编代码
#cpuid.s Sample program to extract the processor Vendor ID
.section .data
output: .ascii "The processor Vendor ID is 'xxxxxxxxxxxx'\n"
.section .text
.globl _start
_start:
    movl $0, %eax
    cpuid
    movl $output, %edi
    movl %ebx, 28(%edi)
    movl %edx, 32(%edi)
    movl %ecx, 36(%edi)
    movl $4, %eax
    movl $1, %ebx
    movl $output, %ecx
    movl $42, %edx
    int $0x80
    movl $1, %eax
    movl $0, %ebx
    int $0x80
```

代码中int $0x80是使用了Linux的系统调用,系统调用是需要设置以下寄存器作为调用参数:

  • EAX contains the system call value.
  • EBX contains the file descriptor to write to.
  • ECX contains the start of the string.
  • EDX contains the length of the string.

编译和执行汇编程序

$ as -o cpuid.o cpuid.as
$ ld -o cpuid cpuid.o
$ ./cpuid
汇编语言可以直接使用c的编译器gcc进行编译和连接
$ gcc -o cpuid cpuid.s
注意:使用gcc编译汇编程序时,汇编语言的程序执行入口,必须使用main标记,同时源程序文件的扩展名必须是.s

会员程序的debug

使用gdb工具进行dubug,需要debug时,需要重新编译连接程序,编译时使用-gstabs参数
$ as -gstabs -o cpuid.o cpuid.as
$ ld -o cpuid cpuid.o
$ gdb cpuid
(gdb) break *_start
(gdb) next
(gdb) next
(gdb) step
(gdb) step
(gdb) cont
(gdb) info registers
(gdb) print /d rbx(gdb)print/t r b x ( g d b ) p r i n t / t rbx
(gdb) print /x $rbx
(gdb) x /42cb &output
(gdb) quit

在汇编程序中使用C语言的函数库

``` 汇编代码
#cpuid2.s View the CPUID Vendor ID string using C library calls
.code32
.section .data
    output:.asciz "The processor Vendor ID is '%s'\n"
.section .bss
    .lcomm buffer, 12
.section .text
.globl main
main:
    movl $0, %eax
    cpuid
    movl $buffer, %edi
    movl %ebx, (%edi)
    movl %edx, 4(%edi)
    movl %ecx, 8(%edi)
    pushl $buffer
    pushl $output
    call printf
    addl $8, %esp
    pushl $0
    call exit
```

使用call指令,调用c函数库,使用pushl进行函数参数压栈
使用gcc 编译连接:
$ gcc -o cpuid2 cpuid2.s
$ ./cpuid2

注意:我使用的环境是centos7-64位系统,做上面使用c函数库的代码时会有问题,需要安装gcc 32位的工具和包,进行以下check,如果没有安装32的工具或包,请补充安装
$ yum list glibc
$ yum list glibc-devel
$ yum list libgcc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嗨!对于逆向学习汇编语言学习笔记,我可以给你一些基本的指导。首先,汇编语言是一种低级语言,它与计算机的底层硬件密切相关。逆向工程则是通过分析和理解已编译的程序来获取程序的内部信息。 以下是一些学习汇编语言和逆向工程的建议: 1. 学习基础知识:了解计算机体系结构、寄存器、内存和指令集等基础概念是必要的。可以先阅读相关的书籍或在线教程,掌握这些基本概念。 2. 掌握汇编语言的语法和指令集:每种计算机体系结构都有自己的汇编语言语法和指令集。选择一种你感兴趣的体系结构(如x86、ARM等),并学习它的汇编语言。 3. 练习编写和调试汇编代码:通过编写简单的汇编代码来熟悉语法和指令集。使用调试器来单步执行代码并观察寄存器和内存的变化。 4. 分析已编译程序:选择一个目标程序进行逆向分析。使用反汇编器将程序转换为汇编代码,并分析代码的逻辑和功能。这有助于理解程序的结构和运行过程。 5. 使用调试器进行动态分析:通过调试器来动态地执行程序,并观察程序在运行时的行为。使用断点、内存查看器和寄存器查看器等工具来分析程序的状态和数据。 6. 学习逆向工程工具和技术:了解常用的逆向工程工具和技术,如IDA Pro、OllyDbg、Ghidra等。掌握这些工具的使用可以提高你的逆向分析能力。 7. 参考优秀资源:阅读与逆向工程和汇编语言相关的书籍、论文和博客,关注相关的社区和论坛。与其他逆向工程师交流经验也是很有帮助的。 记住,逆向工程是一个需要耐心和实践的过程。持续学习和实践将帮助你提高逆向分析的技能。祝你在学习汇编语言和逆向工程的过程取得好成果!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值