movl $0x123,%eax(立即寻址,$表示立即数,%表示寄存器)
movl 0x123,%eax(直接寻址,这是0x123表示的是一个地址)
movl (%ebx),%eax(间接寻址,这时(%ebx)中的值表示内存中的一个地址,可以认为相当于%ebx是指针p,而(%ebx)是*p,这句就是 %eax=*p)
movl 4(%ebx),%edx(变址寻址,在间接寻址的基础上再加4个单位,就是%edx=*(p+4))
ret指令就是pop %eip
Little-Endian:低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
Big-Endian:高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
如0xffffd3c0,小端的情况下,内存排列为c0d3 ffff,大端的情况则为ffff d3c0
gdb x命令用法——https://blog.csdn.net/baidu_24256693/article/details/47298513
/i为指令格式
objdump
objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它还有其他作用,下面以ELF格式可执行文件test为例详细介绍:
objdump -f test 显示test的文件头信息
objdump -d test 反汇编test中的需要执行指令的那些section
objdump -D test 与-d类似,但反汇编test中的所有section
objdump -l test 用文件名和行号标注相应的目标代码,仅仅和-d、-D一起使用。使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。
objdump -h test 显示test的Section Header信息
objdump -t obj:输出目标文件的符号表
objdump -x test 显示test的全部Header信息
objdump -s test 除了显示test的全部Header信息,还显示他们对应的十六进制文件代码
objdump -s -j .text ——-j 选项指定要处理的节,必须要结合其他选项
readelf
-a :--all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I
-h :--file-header 显示elf文件开始的文件头信息.
-l :--program-headers ;--segments 显示程序头(段头)信息(如果有的话)。
-S :--section-headers ;--sections 显示节头信息(如果有的话)。
-g :--section-groups 显示节组信息(如果有的话)。
-t :--section-details 显示节的详细信息(-S的)。
-s :--syms ;--symbols 显示符号表段中的项(如果有的话)。
-e :--headers 显示全部头信息,等价于: -h -l -S
-n :--notes 显示note段(内核注释)的信息。
-r :--relocs 显示可重定位段的信息。
-u :--unwind 显示unwind段信息。当前只支持IA64 ELF的unwind段信息。
-d :--dynamic 显示动态段的信息。
-V :--version-info 显示版本段的信息。
-A :--arch-specific 显示CPU构架信息。
-D :--use-dynamic 使用动态段中的符号表显示符号,而不是使用符号段。
-x <number or name> :--hex-dump=<number or name> 以16进制方式显示指定段内内容。number指定段表中段的索引,或字符串指定文件中的段名。
-w[liaprmfFsoR]或者
-debugdump[=line,=info,=abbrev,=pubnames,=aranges,
=macro,=frames,=frames-interp,=str,=loc,=Ranges] 显示调试段中指定的内容。
-I :--histogram 显示符号的时候,显示bucket list长度的柱状图。
-v :--version 显示readelf的版本信息。
-H :--help 显示readelf所支持的命令行选项。
-W :--wide 宽行输出。