shellcode注入实践
编写shellcode
- 这一部分在我上一篇日志里面已经详细讲过了,这里直接把验证合适的shellcode拿过来。
x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80
准备工作,设置环境
构造要注入的payload
- Linux下有两种基本构造攻击buf的方法:
retaddr+nop+shellcode
,nop+shellcode+retaddr
。因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边。 - 实践证明
nop+shellcode+retaddr
对于pwn1不是成功的payload,但我们依然决定往这个坑里跳一下。手动微笑。
payload结构为nop+shellcode+retaddr
1.编写payload
- 特别提醒:最后一个字符千万不能是x0a。x0a相当于回车键,若回车了下面的操作就做不了了。
2.打开一个新终端(终端2),将payload注入到pwn1中(此处有天坑!!!一定要仔细!!!)
- 敲好
(cat input_shellcode;cat) | ./pwn1
后这里有三种状态,这三种状态中只有一种才能让接下来的实验顺利进行。
- 答案就是第一种。我做实验的时候被这里坑住了很久,一切都正常但到后面查看寄存器的时候上翻了几十行就是找不到shellcode,问题就出在这里,大家在这里千万不要手滑多敲回车(到下面提示的地方再敲),要不然都得重新来过。
- 保持终端2中程序的运行状态。
3.终端1中查询pwn1进程的UID
4.gdb调试,进入对应UID端口
5.反汇编,设置断点
- 注意:continue执行的时候,在
终端2
敲一下回车,终端1中的continue暂停在断点处。
6.往上查询找到shellcode,同时找到要覆盖的地址
- 要覆盖的地址(返回地址)是
0xffffd300
7.更改payload,测试,不成功
- 用
0xffffd300
替换0x01020304
。
payload结构为retaddr+nop+shellcode
- 重新构造payload
- 成功
return-to-libc实验
配置32位linux环境
- sudo apt-get update
- sudo apt-get install lib32z1 libc6-dev-i386
- sudo apt-get install lib32readline-gplv2-dev
添加新用户
- 因为我们最后的是要通过看“是否取得root权限”来判断成功与否的,所以攻击对象不能是root用户,要创建一个新用户。
设置实验背景
- 进入32位环境,关闭地址随机化,设置zsh程序代替/bin/bash
在/tmp文件夹下编写漏洞程序retlib
- 在root用户下编译,关闭栈保护机制。设置SET-UID
在/tmp文件夹下编写getenvaddr和exploit
- getenvaddr用来读取环境变量
- exploit用来攻击
- 同样是在root用户下编译
获取地址并修改exploit
- 获取BIN_SH地址
- 进入gdb设置断点,调试运行获取system和exit地址
- 将上述三个地址修改入exploit.c文件
- 删除之前生成的exploit和badfile(我的exploit因为有权限无法命令行删除,索性直接在places下面的图形化界面tmp文件夹里手动删除)
攻击,成功
- 先运行exploit再运行retlib即可获得root权限,成功!