ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

入门栈溢出(1)

2019-08-14 10:40:48  阅读:194  来源: 互联网

标签:返回 入门 system 地址 内存 shellcode 溢出 函数


1,shellcode (修改返回地址,让其指向溢出数据中的一段指令)
其实就是用攻击指令的起始地址覆盖返回地址,就可以得到shell
payload:padding1+ address of shellcode +paddiing2 + shellcode
padding1:可以任意填充(不要输入 “\x00",否则程序传入溢出数据会造成截断)长度刚好可以覆盖函数的基地址 (填充的长度可以试探,如果返回地址被无效地址,列如’AAAA"覆盖,程序会终址并报错)
address of shelllcode: 是shellcode的起始地址。可以用来覆盖返回地址,
查看返回地址的位置,可以ebp+4,由于可以运行与地址不一致,我们可以在padding2里面填充‘\x90’,就可以让返回地址命中这一段任意地址。
padding2: 填入的数据可以任意填充,长度可以任意的,这是覆盖返回地址
在这里插入图片描述shellcode是关闭系统随机化(ASLR),程序每次·运行时函数的返回地址相同的,这样我们可以输入无效的溢出数据生成core文件,在通过调试工具在core文件中找到返回地址的位置,从而·确定shellcode的起始地址
在这里插入图片描述这种方法的前提是函数调用栈上的数据(shellcode)要有执行的权限(另外一个是关闭内存随机化)
很多时候如果关闭函数调用栈的可执行权限,shellcode就失效。还有一些不受执行权限影响,ret2libc和ROP

2.Return2libc 修改返回地址,让其指向内存中已有的某个函数
思路:就是在内存中确定某个函数地址,并用其覆盖掉返回地址,需要在内存中找到动态库,这就需要找到system()
调用system函数打开sytem(binsh)溢出数据需要参数
以system(binsh),先要写出溢出数据的组成,在确定对应各部分填充进入,
payload:padding1 + address of system() + padding2 + address of “binsh”
在这里插入图片描述padding1: 可以任意填充(不要填充\x00否则程序传入溢出数据时会造成截断)长度刚好覆盖函数基地址,
address of system() ,是system()在内存的地址,用来覆盖返回地址,
padding2:数据长度为4(32位)对应调用system()的返回地址,这里只需要打开shell就好,不需要·关心shell退出之后在哪里,所以这里可以任意填充,
address of binsh 是字符串binsh在内存中的地址,作为传给system()参数

system()函数地址如何得到
看程序如何得到动态链接库中的函数,当函数被动态链接至程序时,程序要确定起始地址,加上相对偏移量,最后得到内存的绝对地址,
如果操作系统打开ASLR,程序每次运行时起始地址都会变化,不能确定绝对地址
如果关闭时,在调试中就可以直接查看system()地址,也可以查看动态库的内存起始地址,在动态库查看相对偏移量,计算函数绝对地址
binsh 可以动态库搜索这个字符串,如果存在时,起始地址+相对地址
如果不存在时,可以把这字符串加在环境变量,通过getenv()函数来确定地址

标签:返回,入门,system,地址,内存,shellcode,溢出,函数
来源: https://blog.csdn.net/weixin_44954083/article/details/99545597

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有