attacker lab
phase2 advice
phase 1
ctarget 会先调用test , test调用getbuf, getbuf调用Get。
任务目的是通过缓冲区注入攻击,将函数getbuf返回直接重定向到函数touch1。
0x28 是 40 比特,
gdb ./ctarget
getbuf 下一次执行的指令是401976, rsp对应的汇编文件行数,
通过objdump 可以获取地址,
40个字符加上touch1的地址,
课件的例子1
课件的例子2
phase 2
ctarget 会先调用test , test调用getbuf, getbuf调用Get。
任务目的是通过缓冲区注入攻击,将函数getbuf返回直接重定向到函数touch2。
参考了知乎网友的翻译,这里需要判断val,储存在rdi的值,和 cookie的值,cookie的值是0x59b997fa。
pushq $0x4017ec
mov $0x59b997fa, %rdi # save cookie into rdi
retq #
将汇编代码转为二进制
gcc -c phase2_mov.s
objdump -d phase2_mov.o > phase2_mov.d
[root@edb3963640a6 target1]# ./hex2raw < phase2.txt > phase2-raw.txt
[root@edb3963640a6 target1]# ./ctarget -q < phase2-raw.txt
使用gdb 查看stack frame,
多层stack frame,
简单介绍stack frame和函数调用的关系
需要获取rsp 的初始地址,
调用函数getbuf时候rsp是0x5561dca0 - 0x28 的到 0x5561dc78
getbuf 函数在调用get函数前,会存入ret address, 这个地址放入rsp, 之后rsp - 0x28, 写入0x28个字符,这部分字符的内容是修改rdi, 然后调用touch2, 然后多出来的部分会影响函数,使函数的返回地址修改rdi的值的地址。
答案如下:
phase3
汇编相关语法
pushq
call 指令
stack frame
函数
stack frame
call_echo 函数调用 echo 函数, call_echo函数的底部是echo执行完之后的地址。
control flow
pushq 指令
pushq指令在执行时会将栈指针rsp减小8个字节,以便为要压入栈中的数据腾出空间。这样,rsp将指向新的栈顶位置,即之前压入的数据的下一个位置。因此,pushq指令会通过减小rsp的值来更新栈指针。
rip寄存器
rip寄存器的值是由call指令或条件跳转指令等控制流指令来改变的。
参考资料
https://www.cs.cmu.edu/afs/cs/academic/class/15213-f17/www/lectures/09-machine-advanced.pdf
https://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/lectures/07-machine-procedures.pdf
https://github.com/magna25/Attack-Lab/blob/master/Phase%202.md
https://zhuanlan.zhihu.com/p/107048472
https://zhuanlan.zhihu.com/p/105428280
https://zhuanlan.zhihu.com/p/60724948