目录


1 Machine-Level Execution

为什么要学汇编? 理解编译器的优化,分析代码低效的来源,暴露高级语言(如C)隐藏的信息(比如Chapter 12不同并发程序中的变量在内存中的地址),写出更安全的代码(防止stack overflow attack)等。当前对一个专业的程序员的要求已经从会写汇编转移到会读汇编。因此我们要学会汇编。

本章重点:熟悉IA32指令,会用gcc将.c生成.o生成可执行文件(并反汇编成.o),会用gdb调试;熟悉C Code Pattern(if else, loop, switch, array, structure, union);深刻理解pointer,stack overflow attack。

Program Encodings:”.c->.s->.o->link后可执行”见这里

C Data Formats in IA32。所有指针都是4Byte(32Bit);没加unsigned就是默认是sign,如int a是sign int(4Byte),unsigned int b是无符号整数(4Byte)。

Accessing Information。寄存器里的值用%eax,内存里的值可以间接寻址为B(%eax,%ecx,A),即(x+Ay+B),表示x+Ay+B地址里的值,其中%eax是x,%ecx是y;数据转移指令有mov,push,pop等,suffix b w l分布对应byte(1Byte) word(2Byte) double word(4Byte)。

Arithmetic and Logical Operationsleafl 3(%eax,%ecx,2), %edx 是将x+2y+3放入%edx,其中%eax是x,%ecx是y;leafl和movel格式相同,意义不同,前者是放地址,后者是放地址里的值;通常leaf会用于快速的加法和乘法,如leafl 3(%eax,%ecx,2), %edx%eax%ecx放的x和y是要计算的变量而不是地址,则结果是x+2y+3就是要的值而不是地址。加减乘除的指令见书本。左移指令sal(算术左移)和shl(逻辑左移)功能一样,右移指令sar(算术右移)和shr(逻辑右移)功能不一样(前者高位填符号位,后者填0),也就是说只有右移才需要考虑符号位而左移不需要。

2 总结

Machine Level Representation of Programs

3 lab

本章有两个作业bomb(通过反汇编,找到相关信息,需要熟练应用control(swtich),函数调用,递归等的assembly code pattern)和bufbomb(通过buf overflow方法进行攻击,需要熟练掌握函数调用中,call和ret指令,stack变化,及%eax,%ebp,%esp,%eip寄存器的关系)。具体code见这里

下面主要对bufbomb的5道题(level 0-4)做一个总结。

bufbomb总结

4 Reference


Share Post

Twitter Google+

Shunmian

The only programmers in a position to see all the differences in power between the various languages are those who understand the most powerful one.