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

这篇博客详细分析了CSAPP二进制炸弹lab6的第六关,主要涉及C语言和Linux环境。博主通过逐部分解析复杂的汇编代码,揭示了代码逻辑,包括多重循环、数值约束、链表结构和排序算法。最终成功完成挑战,实现了链表节点按val值递减排序,并给出了完整的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值