20222324 石国力 《网络与系统攻防技术》 实验一
1.1实践目标
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下:
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。
这几种思路,基本代表现实情况中的攻击目标:
运行原本不可访问的代码片段
强行修改程序执行流
1.2 基础知识
该实践需要同学们
熟悉Linux基本操作
能看懂常用指令,如管道(|),输入、输出重定向(>)等。
理解Bof的原理。
能看得懂汇编、机器指令、EIP、指令地址。
会使用gdb,vi。
当然,如果还不懂,通过这个过程能对以上概念有了更进一步的理解就更好了。
2.实验过程
2.1手工修改程序机器指令,改变程序执行流程,直接跳转到getShell函数
2.1.1反汇编1linux可执行文件并分析
将linux可执行文件pwn1改名为20222324,并保存在/home/sgl20222324/Desktop/目录下,反汇编:
getShell和foo函数部分:
main函数部分:
可以看到在main函数中80484b5这一行,汇编指令“call 8048491”调用了位于地址8048491处的foo函数,其对应的机器指令即为“e8 d7ffffff”,“d7ffffff”是补码,表示-41,41=0x29,80484ba+d7ffffff=80484ba-0x29正好是foo函数的地址8048491,想要main函数调用getShell函数,只需将“d7ffffff”改为“804847d(getShell函数地址)-80484ba”即可,计算得到应改为“c3ffffff“。
2.1.2修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff
将可执行文件20222424复制一份到20222424_1:
进入vi编辑器:
按ESC键,将显示模式切换为16进制模式:
查找要修改的内容并修改d7为c3:
转换16进制为原格式并保存
2.1.3 检查修改后的可执行文件是否调用getShell函数
反汇编可执行文件:
可以看到main函数成功调用getShell函数,此时运行下改后的代码,会得到shell提示符#:
至此,手工修改可执行文件成功!
2.2利用foo函数的BOF漏洞,构造攻击输入字符串,覆盖返回地址,触发getShell函数。
2.2.1利用gdb确认如何覆盖返回地址
使用gdb调试可执行文件,输入字符串,观察返回地址的覆盖情况:
可以看到系统未安装gdb,在请教了同学之后,解决了这个问题
最后是这样子的
可以看到如果输入字符串1111111122222222333333334444444412345678,那1234四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。只要把这四个字符替换为”0804847d“(getShell 的内存地址),输给可执行文件,就会运行getShell。再进一步,我们看到覆盖的顺序和输入的顺序是相反的,所以最终的字符串应该是”11111111222222223333333344444444\x7d\x84\x04\x08“。
2.2.2构造输入字符串
使用Perl生成包含字符串的文件:
使用16进制查看指令xxd查看input文件的内容是否如预期:
将input的输入,通过管道符“|”,作为20222324的输入:
至此,构造字符串进行BOF攻击成功!
2.3注入Shellcode并执行
2.3.1准备工作
设置堆栈可执行:
关闭地址随机化:
2.3.2构造要注入的payload
使用anything+retaddr+nops+shellcode的结构:
注入这段攻击buf::
再开另外一个终端,用gdb来调试20222324这个进程,先找到进程号启动gdb调试这个进程:在另外一个终端中按下回车,再输入C:
这里就能看到 01020304了, 0xffffcfbc 即为返回地址的位置。shellcode挨着,所以地址是 0xffffcfc0。
再次修改构造的字符串,注入这段攻击buf:
至此,注入Shellcode成功!
3.学习体会
在这次实验中,我通过询问同学,上网查询,了解了通过反汇编可以直接地看到汇编语言、机器指令和寄存器使用。这个是我第一次反汇编的体验,提高了我对汇编语言、机器指令的理解与掌握。