20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

时间:2024-01-15 10:33:14

20144303石宇森《网络对抗》PC平台逆向破解

实验1:shellcode注入

实验基础

1、Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcodenop+shellcode+retaddr。我们采用anything+retaddr+nops+shellcode的方法。

2、实验的目标是找到返回地址的位置和shellcode的地址。然后通过修改返回地址使其自动执行shellcode

3、实验前通过命令:apt-get install exestack安装exestack

4、修改一些设置:

root@KaliYL:~# execstack -s pwn1//设置堆栈可执行
root@KaliYL:~# execstack -q pwn1//查询文件的堆栈是否可执行
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

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

实验步骤

1、先用cp复制一个新的pwn1文件

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

2、修改设置

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

3、构造一个shellcode作为输入

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

4、打开一个新的端口,用命令:(cat input_shellcode; cat) > ./20145221pwn1注入这段攻击并执行文件

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

5、开启另一个终端,输入ps -ef | grep ./20144303,查看进程的UID

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

6、进入gdb模式,然后输入attach UID与进程进行连接

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

7、输入命令disassemble foo对foo函数进行反汇编

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

8、在ret处设置一个断点

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

9、在端口下按回车执行一下程序,在gdb中输入c

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

10、查看此时寄存器esp中的值,这个地址就是函数的返回地址

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

11、输入quit退出gdb模式

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

12、重新构造shellcode,将01020304修改为shellcode的首地址0xffffd340

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

13、用xxd input_shellcode查看输入

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

14、再次执行程序,完成攻击

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

实验2:Return-to-libc攻击

实验步骤:

1、输入sudo apt-get update来更新软件源

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

2、使用命令sudo apt-get install lib32z1 libc6-dev-i386安装软件

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

3、进入linux32位环境,然后将地址随机化关闭

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

4、进入bin目录下,通过命令ln -s zsh sh将zsh指向sh

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

5、在tmp目录下,编译20144303retlib.c。retlib是一个漏洞程序,在fread函数中把40字节的badfile中的数据读取到了buffer里。但buffer只有12字节。所以会造成缓冲区溢出。

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

在编译retlib.c时,把这个程序设置为 SET-ROOT-UID 程序,程序的所有者就拥有了root权限

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

6、编译20144303getenvaddr.c。这个程序是用来读取环境变量的

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

7、编译20144303exploit.c。该程序用来进行攻击

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

8、用读取环境变量的函数20144303getenvaddr来获得BIN_SH的地址

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

9、在gdb中获取system和exit的地址分别为0xf7e2eb300xf7e227e0

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

10、修改攻击函数20144303exploit.c中的三个地址的值。然后将之前编译生成的文件和运行生成的badfile文件删掉。重新编译执行。

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

11、先执行程序20144303exploit,再执行20144303retlib。完成攻击,获得了root权限。

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

实验过程中遇到的问题:

1、在安装lib32readline-gplv2-dev时,出现了错误。但是对后面的实验没有什么影响....

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

2、第一遍做实验时,通过getenvaddr函数获取BIN_SH的地址时出现了错误。得到的BIN_SH的地址为0x8,所以最后实验失败。

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

后来重新检查了代码,发现漏洞程序retlib中出现了错误,修改后再次编译,查看BIN_SH的值就正确了。

20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击

感想反思

本次两个实验都是在关闭了地址随机化的前提下完成的,比较好奇假如不能关闭计算机的地址随机化,又该怎样进行攻击呢?另外,虽然完成了实验,得到了实验结果,但是对三个程序的代码还不是很理解。接下来会对这些东西进行研究。路漫漫求修远兮吾将上下而求索