CSAPP 二进制炸弹 binary bomb lab6 第六关 ——深入理解计算机系统

bomb lab 第六关详细分析

由于第六关的汇编代码太长且复杂,需要非常耐心地进行分析,故将整个汇编代码分为几个部分详细说明。

一、Part1
00000000004010f4 <phase_6>:
// arg1=input(input是从外部传入的字符串)
  4010f4:	41 56              push   %r14
  4010f6:	41 55              push   %r13
  4010f8:	41 54              push   %r12
  4010fa:	55                 push   %rbp
  4010fb:	53                 push   %rbx
  4010fc:	48 83 ec 50        sub    $0x50,%rsp	
  401100:	49 89 e5           mov    %rsp,%r13
  401103:	48 89 e6           mov    %rsp,%rsi
  401106:	e8 51 03 00 00     callq  40145c <read_six_numbers>
  
// read_six_numbers
  int read_six_numbers(input,a)	
  {
   //input是phase_6的参数1,a是在栈中分配的一个int*数组
  	return (sscanf(input,"%d %d %d %d %d %d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5]));
  }
//
  40110b:	49 89 e6           mov    %rsp,%r14	
  40110e:	41 bc 00 00 00 00  mov    $0x0,%r12d	
  
>>>>>>>>>>>>>>>>>>>>>>>>>>> 循环开始<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 令 r12d<=>i , rbx<=>j (后面注释的i和j代表这两个寄存器的值)
  401114:	4c 89 ed           mov    %r13,%rbp	
  401117:	41 8b 45 00        mov    0x0(%r13),%eax	# eax=a[i]
  40111b:	83 e8 01           sub    $0x1,%eax	# eax -= 1
  40111e:	83 f8 05           cmp    $0x5,%eax
  401121:	76 05              jbe    401128 <phase_6+0x34>
// if (eax>=0 && eax<=5) -> jmp     else -> bomb (所以eax必须在区间[0,5])
  401123:	e8 12 03 00 00     callq  40143a <explode_bomb>
  401128:	41 83 c4 01        add    $0x1,%r12d	# i++
// r12d一开始为0,这边加1,感觉会是个用于循环的计数器
  40112c:	41 83 fc 06        cmp    $0x6,%r12d
  401130:	74 21              je     401153 <phase_6+0x5f>	# 等于6时跳出循环
  401132:	44 89 e3           mov    %r12d,%ebx	# 否则继续,j初始化=i+1

>>>>>>>>>>>>>>>>>>>>>>>>>>> 内循环开始<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  401135:	48 63 c3           movslq %ebx,

你可能感兴趣的:(CSAPP,c语言,linux)