x86-64寄存器概览之Linux逆向工程一般套路

本文介绍了x86-64架构下的寄存器使用,包括函数调用中寄存器的角色,如%rbx,%rbp,%rsp等。讲解了函数调用栈的概念,以及在逆向工程中如何理解调用栈。还提到了Linux下进行逆向工程的一些常见工具和步骤,如gdb、objdump、strace和分析ELF文件。虽然逆向工程复杂,但通过实践和学习可以逐步掌握。" 120346064,9318566,Linux多线程编程实践:解决触摸屏阻塞问题,"['Linux', '多线程', '嵌入式开发', 'C语言', '程序设计']
摘要由CSDN通过智能技术生成

写本文其实有点心虚,逆向工程是个高深且需要长期积累的过程,在Title里面加入逆向工程关键字有点哗众取宠。不过本文还是尽量能够给予读者一些初步的帮助,其中主要介绍一下x86-64寄存器以及用Linux下进行反向工程技巧。

x86-64寄存器

64位寄存器
x64汇编使用16个通用64位寄存器,其中一些低位可以用作32,26,8位寄存器,寄存器命名如上图所示。这些寄存器使用方法如下图:
64位寄存器使用方法
其中%rbx,%rbp, %r12-r15在函数调用过程中需要保存的,%rbp用来保存一个函数调用帧的栈基地址。
%rsp主要用来保存一个函数调用帧的栈顶,动态函数调用栈开辟就是通过增长和缩减栈顶来实现的。
%rdi, %rsi, %rdx, %rcx,%r8, %r9用来传递函数调用时前6个小于int长度或者指针类型的参数,其余多的参数或者传值的结构体主要通过栈来传递。
%rax可用作函数返回,如果其返回值小于64位长度。否则将使用栈来返回结果,如返回值是结构体的时候。

一个函数调用栈

要进行逆向工程或者反向汇编,我们就需要了解函数调用栈。熟练的C/C++码农,应该对于进程堆栈的概念很熟悉,其中栈是辅助函数调用局部存储空间。每一次函数调用都将产生新的栈帧,每一个栈帧包含了当前堆栈上数据和通用寄存器上数据。请自行Google函数调用栈来获得更多知识点。本文将举一个自己认为好理解的例子来帮助理解调用栈以及后续的反汇编过程。
假设我们写了如下的一段代码:

#include <stdio.h>

typedef struct _node{
        int a;
        char b;
}NODE;

int func(int a, int b, int c, char d, char e, char *f, NODE g, int h)
{
        int res;
        res = a > b ? a : b;

        printf("%c %c %s\n", d, e, f);
        printf("%d %c\n", g.a, g.b);
        printf("%d\n", h);

        return res;
}

int main(int argc, char *argv[])
{
        int res;
        char f[12] = "hello world";
        NODE g;
        g.a = 1;
        g.b = 'b';

        res = func(1, 2, 3, 'd', 'e', f, g, 4);
        return res;
}

那么调用func函数产生栈帧如下:
栈帧

Linux逆向一般套路

  • 获得符号表
# nm test  //用nm命令获得符号表
00000000006007d8 d _DYNAMIC
0000000000600970 d _GLOBAL_OFFSET_TABLE_
00000000004006b8 R _IO_stdin_used
                w _Jv_RegisterClasses
00000000006007b8 d __CTOR_END__
00000000006007b0 d __CTOR_LIST__
00000000006007c8 D __DTOR_END__
00000000006007c0 d __DTOR_LIST__
00000000004007a8 r __FRAME_END__
00000000006007d0 d __JCR_END__
00000000006007d0 d __JCR_LIST__
000000000060099c A __bss_start
0000000000600998 D __data_start
0000000000400670 t __do_global_ctors_aux
0000000000400430 t __do_global_dtors_aux
00000000004006c0 R __dso_handle
                w __gmon_start__
00000000006007ac d __init_array_end
00000000006007ac d __init_array_start
00000000004005d0 T __libc_csu_fini
00000000004005e0 T __libc_csu_init
                U __libc_start_main@@GLIBC_2.2.5
000000000060099c A _edata
00000000006009b0 A _end
00000000004006a8 T _fini
0000000000400390 T _init
00000000004003e0 T _start
000000000040040c t call_gmon_start
00000000006009a0 b completed.6364
0000000000600998 W data_start
00000000006009a8 b dtor_idx.6366
00000000004004a0 t frame_dummy
00000000004004d0 T func
00
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值