这是一个本人学习 csapp 的 learning 库

103 lines
2.1 KiB

2 years ago
  1. ### 1. 使用 objdump 反编译 bomb
  2. ```objdump -d bomb > bomb.s```
  3. ### 2. 查找 main 函数
  4. 发现调用了函数 phase_1, phase_2 等等函数
  5. 猜测这些函数即用来验证输入字符串的正确性
  6. ### 3. 查看函数 phase_1
  7. 发现调用了函数 strings_not_equal
  8. 并且在调用之前为 %esi 赋值 0x402400
  9. 说明将其作为参数传进然后作为验证
  10. 猜测其为所需字符串的地址
  11. ### 4. 使用 gdb 查看字符串
  12. 为函数 phase_1 设置断点 ```break phase_1```
  13. 打印地址处字符串 ```print (char *) 0x402400```
  14. 得到 phase1
  15. ### 5. 查看函数 phase_2
  16. 发现调用函数 read_six_numbers
  17. 说明输入需要 6 个数字
  18. 查看后续汇编代码发现进行了循环控制
  19. 根据汇编代码得到 6 个数字
  20. 由于输入函数用的是 scanf,故不用考虑转为字符,直接输入 6 个数字
  21. 得到 phase2
  22. ### 6. 查看函数 phase_3
  23. 发现调用了 scanf 函数
  24. 观察参数寄存器 %rcx, %rdx, %rsi
  25. 使用 gdb 知需要输入两个数字
  26. cmpl 得知第一个数字需要小于 0x7
  27. 使用 gdb 观察间接跳转指令 jmpq
  28. 指向后面的 switch 控制流
  29. 从而得知输入的两个数字相关联
  30. 即本题多解
  31. 得到其中一个 phase3
  32. ### 7. 查看函数 phase_4
  33. 与 phase_3 同样的输入
  34. 第一个数字小于等于 0xe
  35. 发现调用 func4 且返回值需为 0
  36. 观察调用后代码发现第二个数为 0
  37. 观察 func4 发现第一个数需为 7
  38. 得到 phase4
  39. ### 8. 查看函数 phase_5
  40. 需输入字符串
  41. 循环根据输入字符串的 asc 值的第四位索引内置的字符串
  42. 用 gdb 查看最后得到的字符串是 flyers
  43. 得到 phase_5
  44. ### 9. 查看函数 phase_6
  45. 调用函数 read_six_numbers 知需输入 6 个数字
  46. 第一个循环说明每个数字需互不相同且小于等于 6
  47. 第二个循环对每个数字作 7 - x
  48. 第三个循环根据数字得到 6 个相当于链表的地址
  49. 第四个循环改变链表顺序
  50. 第五个循环说明得到的 6 个地址指向的数字需大于等于下一个地址指向的数字
  51. 得到 phase_6
  52. **注意:0x30和0x40相差16而不是10!!**