PWN 二进制漏洞挖掘与利用.pptxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

PWN;;PWN?|概述;exploit

用于攻击的脚本与方案

payload

攻击载荷,是的目标进程被劫持控制流的数据

shellcode

调用攻击目标的shell的代码;;CCode(p1.cp2.c);sum:

pushebp

movebp,esp

moveax,[ebp+12]

addeax,[ebp+8]

popebp

ret;什么是可执行文件?;ELF文件结构;ELF文件头表(ELFheader)

记录了ELF文件的组织结构

程序头表/段表(Programheadertable)

告诉系统如何创建进程

生成进程的可执行文件必须拥有此结构

重定位文件不一定需要

节头表(Sectionheadertable)

记录了ELF文件的节区信息

用于链接的目标文件必须拥有此结构

其它类型目标文件不一定需要;磁盘中的ELF(可执行文件)与内存中的ELF(进程内存映像);磁盘中的ELF(可执行文件)与内存中的ELF(进程内存映像);二进制基础|进程虚拟地址空间;地址以字节编码;二进制基础|进程虚拟地址空间;二进制基础|进程虚拟地址空间;段(segment)与节(section);intglb;

char*str=“Helloworld!”;

intsum(intx,inty)

{

intt=x+y;

returnt;

}

intmain()

{

sum(1,2);

void*ptr=malloc(0x100);

read(0,ptr,0x100);//input“deadbeef”

return0;

};大端序与小端序;cpu;amd64寄存器结构;$./binary;$./binary;MOV

LEA

ADD/SUB

PUSH

POP

CMP

;MOV;PUSH;LEAVE;intel;;函数调用栈是指程序运行时内存一段连续的区域

用来保存函数运行时的状态信息,包括函数参数与局部变量等

称之为“栈”是因为发生函数调用时,调用函数(caller)的状态被保存在栈内,被调用函数(callee)的状态被压入调用栈的栈顶

在函数调用结束时,栈顶的函数(callee)状态被弹出,栈顶恢复到调用函数(caller)的状态

函数调用栈在内存中从高地址向低地址生长,所以栈顶对应的内存地址在压栈时变小,退栈时变大;;函数状态主要涉及三个寄存器——esp,ebp,eip。esp用来存储函数调用栈的栈顶地址,在压栈和退栈时发生变化。ebp用来存储当前函数状态的基地址,在函数运行时不变,可以用来索引确定函数参数或局部变量的位置。eip用来存储即将执行的程序指令的地址,cpu依照eip的存储内容读取指令并执行,eip随之指向相邻的下一条指令,如此反复,程序就得以连续执行指令。

下面让我??来看看发生函数调用时,栈顶函数状态以及上述寄存器的变化。变化的核心任务是将调用函数(caller)的状态保存起来,同时创建被调用函数(callee)的状态。

首先将被调用函数(callee)的参数按照逆序依次压入栈内。如果被调用函数(callee)不需要参数,则没有这一步骤。这些参数仍会保存在调用函数(caller)的函数状态内,之后压入栈内的数据都会作为被调用函数(callee)的函数状态来保存。;然后将调用函数(caller)进行调用之后的下一条指令地址作为返回地址压入栈内。这样调用函数(caller)的eip(指令)信息得以保存。

;再将当前的ebp寄存器的值(也就是调用函数的基地址)压入栈内,并将ebp寄存器的值更新为当前栈顶的地址。这样调用函数(caller)的ebp(基地址)信息得以保存。同时,ebp被更新为被调用函数(callee)的基地址。;再之后是将被调用函数(callee)的局部变量等数据压入栈内。;在压栈的过程中,esp寄存器的值不断减小(对应于栈从内存高地址向低地址生长)。压入栈内的数据包括调用参数、返回地址、调用函数的基地址,以及局部变量,其中调用参数以外的数据共同构成了被调用函数(callee)的状态。在发生调用时,程序还会将被调用函数(callee)的指令地址存到eip寄存器内,这样程序就可以依次执行被调用函数的指令了。

看过了函数调用发生时的情况,就不难理解函数调用结束时的变化。变化的核心任务是丢弃被调用函数(callee)的状态,并将栈顶恢复为调用函数(caller)的状态。

首先被调用函数的局部变量会从栈内直接弹出,栈顶会指向被调用函数(callee)的基地址。;然后将基地址内存储的调用函数(caller)的基地址从栈内弹出,并存到ebp寄存器内。

文档评论(0)

WZR1 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档