第二个实验 2-Bomb Lab

phase_1
答案:
Border relations with Canada have never been better.

phase_2
答案:
1 2 4 8 16 32

phase_3
答案是下面8组数的任意一组:
0 207
1 311
2 707
3 256
4 389
5 206
6 682
7 327

pahase_4
答案也不唯一,可以是
7 0

phase_5
答案是六个字母,且这六个字母的ASCII的后四位用十进制表示分别为9 15 14 5 6 7 (或者用十六进制为 0x9 0xf 0xe 0x5 0x6 0x7)
答案不唯一可以是:
ionefg (其十六进制为 0x69 0x6f 0x6e 0x65 0x66 0x67)
也可以是:
yonuvw (其十六进制为 0x79 0x6f 0x6e 0x75 0x76 0x77)

phase_6
答案是6个不大于6的数字,6个数字全不相等,且会根据每个数字是否为6,采取不同的操作,而且还涉及一个链表。其实有用的信息大部分我都得到了,但是这个炸弹的相关代码太长了,而且跳来跳去,一不留神就要重新推导,草稿纸都不够用了。
前5个炸弹都没有GDB调试,但是最后一个炸弹太难了,所以决定借助GDB调试

    (gdb) b(breakpoint): 用法:b 函数名 :对此函数进行中断 ;b 文件名:行号;(gdb) run:启动程序,运行至程序的断点或者结束;(gdb) l(list): 用法:l funcname,制定函数的源码(gdb) s(step): 进入函数,逐语句运行;(gdb) n(next): 不进入函数,逐过程运行;(gdb) c(continue):继续运行,跳至下一个断点;(gdb) p(print):打印显示变量值;(gdb) set variable=value, 为变量赋值;(gdb) kill:终止调试的程序;(gdb) h(help):列出 gdb 详细命令帮助列表;(gdb) clear filename.c:30:清除 30 行处的断点;(gdb) info break:显示断点信息;(gdb) delete 断点编号:断点编号是 info break 后显示出来的;(gdb) bt(backtrace):回溯到段出错的位置;(gdb) frame 帧号:帧号是 bt 命令产生的堆栈针;(gdb) q:退出;(gdb) x(examine):查看内存中的值等 // 详细内容在 gdb 中输入 help x 查看

用了一整天时间,发现GDB还是用不惯,最后还是得靠自己推,感觉自己像是个侦探
通过分析代码,假设输入的6个数字分别是:num[0],num[1],num[2],num[3],num[4],num[5]
分别用0x7减去这些数字得到:j=7-num[i], i=0~5
表示在第i+1个位置上放节点node j .

链表含有6个节点(node),每个node都有两个四字节的数字以及一个指针,程序会根据输入的六个数字,对原有的6个节点以节点的第一个数字单调不增的顺序排序(实际就是单调递减)
下面只给出每个节点的数字值(忽略指针值)
node1:0x00 00 01 4c 0x00 00 00 01
node2:0x00 00 00 a8 0x00 00 00 02
node3:0x00 00 03 9c 0x00 00 00 03
node4:0x00 00 02 b3 0x00 00 00 04
node5:0x00 00 01 dd 0x00 00 00 05
node6:0x00 00 01 bb 0x00 00 00 06

重新排序的结果应当是 node3–>node4–>node5–>node6–node1–>node2
所以7-num[0]=3, 7-num[1]=4, 7-num[2]=5 …
phase答案:
4 3 2 1 6 5

00000000004010f4 <phase_6>:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
调用read_six_numbers 读取6个数字,放在以rsp开始的栈空间;
假设六个数字分别为num[0],num[1]....num[5]4010f4: 41 56                   push   %r144010f6:  41 55                   push   %r134010f8:  41 54                   push   %r124010fa:  55                      push   %rbp4010fb:  53                      push   %rbx           4010fc:   48 83 ec 50             sub    $0x50,%rsp  ;分配栈空间                                         401100:   49 89 e5                mov    %rsp,%r13   ;r13=rsp         401103:    48 89 e6                mov    %rsp,%rsi   ;rsi=rsp401106: e8 51 03 00 00          callq  40145c <read_six_numbers>  ;读取6个数字,放在以rsp开始的栈空间中,;假设六个数字分别为num[0],num[1]....num[5]
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!40110b:  49 89 e6                mov    %rsp,%r14           ;r14=rsp40110e: 41 bc 00 00 00 00       mov    $0x0,%r12d          ;r12d=0 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6个数字均小于或等于6,且6个数字之间或不相等401114:   4c 89 ed                mov    %r13,%rbp    ;rsp=r13=rsp401117:   41 8b 45 00             mov    0x0(%r13),%eax   ;eax=num[0]40111b: 83 e8 01                sub    $0x1,%eax    ;eax=num[0]-140111e:   83 f8 05                cmp    $0x5,%eax    ;num[0]-1必小于或等于0x5,即num[0]不大于6401121:   76 05                   jbe    401128 <phase_6+0x34> ;跳到401128401123:    e8 12 03 00 00          callq  40143a <explode_bomb>  401128: 41 83 c4 01             add    $0x1,%r12d   ;r12d=r12d+1=140112c:    41 83 fc 06             cmp    $0x6,%r12d401130:    74 21                   je     401153 <phase_6+0x5f>i    ;跳出大循环401132:   44 89 e3                mov    %r12d,%ebx
***********************************************************401135:  48 63 c3                movslq %ebx,%rax401138: 8b 04 84                mov    (%rsp,%rax,4),%eax40113b:    39 45 00                cmp    %eax,0x0(%rbp)40113e:    75 05                   jne    401145 <phase_6+0x51>401140:  e8 f5 02 00 00          callq  40143a <explode_bomb>401145:   83 c3 01                add    $0x1,%ebx401148: 83 fb 05                cmp    $0x5,%ebx40114b: 7e e8                   jle    401135 <phase_6+0x41>
***********************************************************40114d:  49 83 c5 04             add    $0x4,%r13401151: eb c1                   jmp    401114 <phase_6+0x20>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++401153:   48 8d 74 24 18          lea    0x18(%rsp),%rsi  ;rsi=rsp+0x18  401158:    4c 89 f0                mov    %r14,%rax40115b: b9 07 00 00 00          mov    $0x7,%ecx用7-num[x]代替原来的num[x]401160: 89 ca                   mov    %ecx,%edx        ;ecx=7401162:  2b 10                   sub    (%rax),%edx  ;edx=7-num[x]401164:   89 10                   mov    %edx,(%rax)  ;num[x]=7-num[x]   401166: 48 83 c0 04             add    $0x4,%rax        ;rax=&num[x+1]40116a: 48 39 f0                cmp    %rsi,%rax    ;rsi=rsp+0x1840116d:  75 f1                   jne    401160 <phase_6+0x6c>40116f:  be 00 00 00 00          mov    $0x0,%esi    ;esi=0401174:  eb 21                   jmp    401197 <phase_6+0xa3>*******************************************************************************
根据输入数字对将链表分配到栈的不同位置401176:  48 8b 52 08             mov    0x8(%rdx),%rdx   ;rdx=rdx+0x840117a:   83 c0 01                add    $0x1,%eax        ;eax=eax+140117d: 39 c8                   cmp    %ecx,%eax    ;ecx=7-num[x] 且7-num[x]>1 40117f:   75 f5                   jne    401176 <phase_6+0x82> 401181: eb 05                   jmp    401188 <phase_6+0x94> ;eax一直累加到7-num[x]时,跳转
*****************************************************rsi=0401183:  ba d0 32 60 00          mov    $0x6032d0,%edx401188:    48 89 54 74 20          mov    %rdx,0x20(%rsp,%rsi,2)   ;将节点保存在栈中40118d:    48 83 c6 04             add    $0x4,%rsi    ;rsi=rsi+4401191: 48 83 fe 18             cmp    $0x18,%rsi401195:    74 14                   je     4011ab <phase_6+0xb7>401197:  8b 0c 34                mov    (%rsp,%rsi,1),%ecx   ;ecx=(rsp+rsi)40119a: 83 f9 01                cmp    $0x1,%ecx    ;比较7-num[x]是否小于等于1,由于num[x]<=6,若7-num[x]<=1,则num[x]=640119d: 7e e4                   jle    401183 <phase_6+0x8f> ;若num[x]==6,则跳转
*****************************************************40119f:    b8 01 00 00 00          mov    $0x1,%eax    ;eax=14011a4:  ba d0 32 60 00          mov    $0x6032d0,%edx4011a9:    eb cb                   jmp    401176 <phase_6+0x82>
*******************************************************************************4011ab:  48 8b 5c 24 20          mov    0x20(%rsp),%rbx4011b0:   48 8d 44 24 28          lea    0x28(%rsp),%rax4011b5:   48 8d 74 24 50          lea    0x50(%rsp),%rsi4011ba:   48 89 d9                mov    %rbx,%rcx-------------------------------------------------------------------------------
调整链表指针4011bd:   48 8b 10                mov    (%rax),%rdx4011c0:   48 89 51 08             mov    %rdx,0x8(%rcx)4011c4:    48 83 c0 08             add    $0x8,%rax4011c8: 48 39 f0                cmp    %rsi,%rax4011cb: 74 05                   je     4011d2 <phase_6+0xde>4011cd:  48 89 d1                mov    %rdx,%rcx4011d0: eb eb                   jmp    4011bd <phase_6+0xc9>4011d2:  48 c7 42 08 00 00 00    movq   $0x0,0x8(%rdx)   ;最后一个节点的尾指针等于0
-------------------------------------------------------------------------------4011d9:  00 4011da:  bd 05 00 00 00          mov    $0x5,%ebp
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
检查节点数值是否单调不增4011df: 48 8b 43 08             mov    0x8(%rbx),%rax4011e3:    8b 00                   mov    (%rax),%eax  ;这行代码可以推定,比较的数值是四个字节4011e5:  39 03                   cmp    %eax,(%rbx)  ;也可以推出,node节点含有两个四字节的数值,以及一个指针4011e7: 7d 05                   jge    4011ee <phase_6+0xfa>4011e9:  e8 4c 02 00 00          callq  40143a <explode_bomb>4011ee:   48 8b 5b 08             mov    0x8(%rbx),%rbx4011f2:    83 ed 01                sub    $0x1,%ebp4011f5: 75 e8                   jne    4011df <phase_6+0xeb>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~4011f7:  48 83 c4 50             add    $0x50,%rsp4011fb:    5b                      pop    %rbx4011fc:  5d                      pop    %rbp4011fd:  41 5c                   pop    %r124011ff:  41 5d                   pop    %r13401201:  41 5e                   pop    %r14401203:  c3                      retq   ///
链表,一共6个节点
00000000006032d0 <node1>:   ;原数据采用小端表示 实际node1中数据值为00 00 00 01 00 00 01 4c  6032d0:   4c 01 00                add    %r8,(%rax)6032d3:    00 01                   add    %al,(%rcx)6032d5:    00 00                   add    %al,(%rax)6032d7:    00 e0                   add    %ah,%al6032d9:   32 60 00                xor    0x0(%rax),%ah6032dc: 00 00                   add    %al,(%rax)...00000000006032e0 <node2>: ;node2 00 00 00 02 00 00 00 a86032e0:   a8 00                   test   $0x0,%al6032e2:  00 00                   add    %al,(%rax)6032e4:    02 00                   add    (%rax),%al6032e6:    00 00                   add    %al,(%rax)6032e8:    f0 32 60 00             lock xor 0x0(%rax),%ah6032ec:   00 00                   add    %al,(%rax)...00000000006032f0 <node3>: ;node3 00 00 00 03 00 00 03 9c6032f0:   9c                      pushfq 6032f1:  03 00                   add    (%rax),%eax6032f3:   00 03                   add    %al,(%rbx)6032f5:    00 00                   add    %al,(%rax)6032f7:    00 00                   add    %al,(%rax)6032f9:    33 60 00                xor    0x0(%rax),%esp6032fc:    00 00                   add    %al,(%rax)...0000000000603300 <node4>: ;node4 00 00 00 04 00 00 02 b3603300:   b3 02                   mov    $0x2,%bl603302:  00 00                   add    %al,(%rax)603304:    04 00                   add    $0x0,%al603306:  00 00                   add    %al,(%rax)603308:    10 33                   adc    %dh,(%rbx)60330a:    60                      (bad)  60330b:  00 00                   add    %al,(%rax)60330d:    00 00                   add    %al,(%rax)...0000000000603310 <node5>:  ;00 00 00 05 00 00 01 dd603310:    dd 01                   fldl   (%rcx)603312:    00 00                   add    %al,(%rax)603314:    05 00 00 00 20          add    $0x20000000,%eax603319:  33 60 00                xor    0x0(%rax),%esp60331c:    00 00                   add    %al,(%rax)...0000000000603320 <node6>:  ;00 00 00 06 00 00 01 bb603320:    bb 01 00 00 06          mov    $0x6000001,%ebx...///

2-Bomb Lab相关推荐

  1. [精品]CSAPP Bomb Lab 解题报告(七)——隐藏关卡

    接上篇[精品]CSAPP Bomb Lab 解题报告(六) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 ...

  2. [精品]CSAPP Bomb Lab 解题报告(六)

    接上篇[精品]CSAPP Bomb Lab 解题报告(五) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 ...

  3. [精品]CSAPP Bomb Lab 解题报告(五)

    接上篇[精品]CSAPP Bomb Lab 解题报告(四) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 ...

  4. [精品]CSAPP Bomb Lab 解题报告(四)

    接上篇[精品]CSAPP Bomb Lab 解题报告(三) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 ...

  5. [精品]CSAPP Bomb Lab 解题报告(三)

    接上篇[精品]CSAPP Bomb Lab 解题报告(二) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 ...

  6. [精品]CSAPP Bomb Lab 解题报告(二)

    接上篇[精品]CSAPP Bomb Lab 解题报告(一) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 ...

  7. [精品]CSAPP Bomb Lab 解题报告(一)

    接上篇堆栈图解CSAPP Bomb Lab实验解析 gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 查看字 ...

  8. 堆栈图解CSAPP Bomb Lab实验解析

    CSAPP Bomb Lab 实验解析 Bomblab是csapp的第二个配套实验,该实验提供了一个bomb二进制文件和一个bomb.c源文件,我们的目标是运行bomb并按照提示一步步输入字符串,直到 ...

  9. CSAPP Bomb Lab记录

    记录关于CSAPP 二进制炸弹实验过程 (CSAPP配套教学网站Bomb Lab自学版本,实验地址:http://csapp.cs.cmu.edu/2e/labs.html) (个人体验:对x86汇编 ...

  10. CSAPP实验二——bomb lab实验

    CSAPP实验二-- bomb lab实验 实验前准备 第一部分(phase_1) 第二部分(phase_2) 第三部分(phase_3) 第四部分(phase_4) 第五部分(phase_5) 第六 ...

最新文章

  1. IOS的钥匙串,确保本地隐私数据的安全
  2. 几个不错的java类、jar包及其依赖查找网站。。。
  3. PyCharm-缩进 格式化代码
  4. Spark读取配置源码剖析
  5. socket,与粘包
  6. 当各大编程语言摆起地摊来……
  7. 机电大作业(第一阶段)
  8. 安全扫描失败无法上传_思看科技-当木雕遇上全球首创的三维扫描仪
  9. 项目管理—领导力与管理的区别
  10. 对接支付通道如何收费?支付接口收费标准
  11. 20230222作业
  12. word制作招聘启示文档教学
  13. tm1650按键处理c语言,求助51C语言X9C系列APP遥控驱动显示TM1650怎么将下面的程序合成...
  14. centos 7 查看oracle,Centos7下oracle配置(详细)
  15. 和菜头:在碎片化的轰炸中喘息
  16. python数据结构——无序,有序列表抽象数据类型,链表
  17. 题目 1441: 幸运数
  18. deepin 安装显卡后,可支持双屏展示
  19. 全爱科技发布边缘计算主板QA200PCIE
  20. 使用3DMAX制作“黄房子”教程(一)

热门文章

  1. 分享:笔记本电脑有杂音解决技巧
  2. 众包数据标注中的隐类别分析
  3. 分享一款精美的后台模板
  4. 分模块创建ssm项目
  5. 物联网全栈教程-从云端到设备(三)
  6. Flask搭建api服务-生成API文档
  7. 2272: 又是01串(http://acm.zzuli.edu.cn/problem.php?id=2272csrf=nr0h1HsiO5WDrN3Jk1j9aUmgYOdn7QAV)
  8. 基于微信小程序商店管理系统源码成品(微信小程序毕业设计)
  9. 什么是白皮书?【理解较局限,仅个人学习记录】
  10. axure不能导出图片_Axure RP把原型图导出成图片格式的操作技巧