Dear Assembly(2)

By on

继续我们的拆炸弹之旅~


Phase_6

作业的要求也就是做到 phase_5,但是很感兴趣所以继续往下做~

代码如上。

第 4 行的 strtol 函数:字符串按照 10 进制转换成长整形,这里不再赘述(就是得到输入的数)。并且第 5 行把它放在了 node0 中。

目光投向第 12 行的 cmp(很重要啊混蛋!),%edx == *(%rax),往上再看三行相当于 %rax = %rax + 8 做了 3 次,指针向后移动了三个 address 长度。再来分析 fun6 究竟做了什么:

fun6 就是长长长+看不懂!)

尽管如此还是得继续,手写一下各个寄存器的转化,分析一下 fun6 的作用:排序。

题目就转换成对所有数排序后第四个数是否等于输入的数,观察一下 node1node9 ,答案也就出来了:

取 600 ~ 673(分别对应 node8node6)中的任意一个整数

Secret_Phase

最好玩的莫过于做完了布置的作业继续探索了!Let’s Go On!

说到 Secret Phase,第一次看到是因为用 x /32c 看格式化字符串的时候发现了:

austinpowers

后来发现在每个 phase 做完后的 phase_defused 有个调用:

顺藤摸瓜,看了一下地址在 0x401ec4 中的格式化字符串:

%d %s

并且和 austinpowers 比较了。并且 0x603030 这个入口也就是第四题的输入,即在 ⑨ 后面加上 austinpowers 就进入了 secret_phase

最后来看一下 secret_phase 和调用的 fun7

这里建立了一棵树,他的数据结构就是节点自身和左右孩子。第 15 行的 cmp(跟你们说了很重要!)函数要求我们 fun7 的返回值是 3。画出树得到最后的答案:

107

撒花,成绩就是 62.5/50 了!

About GDB

关于 gdb 这里也想谈谈。

通过这次的 lab 作业提升了很多关于 gdb 调试的技巧。

给大家列一些常用的命令吧~

gdb <file>: 开始调试><

run, quit: 开始和退出

break func/*0x804820: 给 func 函数/在地址为 0x804820 处设置断点

delete/disable/enable 1: 删除/禁用/启用断点 1(自动标号)

stepi: 执行一条指令

nexti: 执行一条指令,但是在函数调用中不停止

step: 执行一条C指令

disassemble func/0x804820: 查看 func 函数/地址在 0x804820 的汇编语句

print /x $rip: 16进制输出PC

print /d $rip: 10进制输出PC

print /t $rip: 2进制输出PC

x /[NUM][SIZE][FORMAT] where: 指定格式输出,NUM 位数,SIZE 代表每一位的大小(例如 b=byte,w=word,g=giant),FORMAT 代表格式(x,d,t),WHERE 代表地址。

info r: 查看寄存器

References

CSAPP Bomb Lab


What’s Next

下一篇会主要介绍一下 lab3 的缓存区攻击的作业。