ABI(Application Binary Interface): 应用程序二进制接口 描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的低接口。
ABI百度百科一个完整的ABI,像 Intel二进制兼容标准Intel Binary Compatibility Standard (iBCS) ,允许支持它的操作系统上的程序不经修改在其他支持此ABI的操作系统上运行。
- 1Byte=8bit,1KB=1024B,1MB=1024KB,1GB=1024MB,1TB=1024GB。
- 汇编指令
关于二进制炸弹参考博客
fastcall
__fastcall 是一种快速调用方式。
**调用约定(Calling Convention)**规定将前两个参数由寄存器ecx和edx来传递,其余参数还是通过堆栈传递(从右到左)。
不同编译器编译的程序规定的寄存器不同。在Intel 386平台上,使用ECX和EDX寄存器。
使用__fastcall方式无法用作跨编译器的接口。
可参考GCC说明文档。
Linux下五个查找命令
objdump
objdump 有点像那个快速查看之类的工具,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。
对于一般只想让自己程序跑起来的程序员,这个命令没有更多意义,对于想进一步了解系统的程序员,应该掌握这种工具,至少你可以自己写写shellcode了,或者看看人家给的
exploit 中的 shellcode 是什么东西。
GDB
x86
- CPU内部产生的数称为立即数。
- 在汇编程序中立即数前面加"$"。
- 寄存器前面加"%",以便跟符号名区分开。
· x86汇编的两种语法:intel语法和AT&T语法。
x86汇编一直存在两种不同的语法,在intel的官方文档中使用intel语法,Windows也使用intel语法,而UNIX平台的汇编器一 直使用AT&T语法,所以本书使用AT&T语法。 mov %edx,%eax 这条 指令如果用intel语法来写,就是 mov eax,edx ,寄存器名不加 % 号,并且源操作数和目标操作数的位置互换。本书不详细讨论这两种语法之间的区别,读者可以参[AssemblyHOWTO]。
介绍x86汇编的书很多,UNIX平台的书都采用AT&T语法,
例如[GroudUp],其它书一般采用intel语法,例如[x86Assembly]。
x86的寄存器
x86的通用寄存器有eax、ebx、ecx、edx、 edi、esi。
这些寄存器在大多数指令中是可以任意使用的。但有些指令限制只能用其中某些寄存器做某种用途,例如除法指令idivl规定被除数在eax寄存器中,edx寄存器必须是0,而除数可以是任何寄存器中。计算结果的商数保存在eax寄存器中(覆盖被除数),余数保存在edx寄存器。
x86的特殊寄存器有ebp、esp、eip、eflags。eip是程序计数器。eflags保存计算过程中产生的标志位,包括进位、溢出、零、负数四个标志位,在x86的文档中这几个标志位分别称为CF、OF、ZF、SF。ebp和esp用于维护函数调用的栈帧。
-
esp为栈指针 ,用于指向栈的栈顶(下一个压入栈的活动记录的顶部)。寄存器esp指向当前的栈帧的顶部(低地址)。
-
ebp为帧指针,指向当前活动记录的底部。寄存器ebp指向当前的栈帧的底部(高地址)。
每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。
注意:ebp指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的底部。严格说来,“栈帧底部”和“栈底”是不同的概念;esp所指的栈帧顶部和系统栈的顶部是同一个位置。
**注:**64位数通常存储为,高32位放在edx,低32位放在eax。
-
leal(load effective address) S,D -> &S -> D
-
movl S,D -> S -> D
简单的说就是 movl是把访问的内存内容赋值给寄存器, leal是將地址赋值给寄存器
条件码:
条件码寄存器描述了最近的算数或逻辑操作的属性。
CF:进位标志,最高位产生了进位,可用于检查无符号数溢出。
OF:溢出标志,二进制补码溢出——正溢出或负溢出。
ZF:零标志,结果为0。
SF:符号标志,操作结果为负。