学习
实践
活动
专区
工具
TVP
写文章

溢出

0x10 背景知识   溢出条件:一是程序要有向内写入数据的行为;二是程序并不限制写入数据的长度。 顶对应的内存地址在压时变小,退时变大。 可能需要参数,所以溢出数据也要包括必要的参数。 of gadget n 要解决的问题: 1.溢出后要实现什么效果? 在调用 mprotect() 为开启可执行权限之后,我们希望执行一段 shellcode,所以要将 shellcode 也加入溢出数据,并将 shellcode 的开始地址加到 int 0x80 的 假如函数 B 在溢出之前已经被调用过,我们当然可以通过前一个问题的答案来获得地址。但我们心仪的攻击函数往往并不满足被调用过的要求,也就是 GOT 表中并没有其真实的内存地址。

10220

Python溢出

Python 溢出 python3.5.4 递归函数最恶心的时候莫非溢出(Stack overflow)。 如何解决? 这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个帧,不会出现溢出的情况。 ,因此,无论多少次调用也不会导致溢出。 遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致溢出。 Python标准的解释器没有针对尾递归做优化,任何递归函数都存在溢出的问题 小结 方法一:人为修改默认递归长度 方法二:人为修改python解释器,将其优化,会十分有趣 如果您看到这篇文章有收获或者有不同的意见

76820
  • 广告
    关闭

    新年·上云精选

    热卖云产品新年特惠,2核2G轻量应用服务器9元/月起,更多上云必备产品助力您轻松上云

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    初探溢出

    下面我们直接开始,从溢出开始 0x02 溢出函数定位 在HackSysExtremeVulnerableDriver-3.00\Driver\HEVD\BufferOverflowStack.c文件中 类型对应四个字节,那么512*4=2048=800h,这和IDA逆向出来的代码是相同的: 而UserBuffer和Size为传入的参数,并且对Size的大小没有限制,那么倘若Size大小大于800h字节,则会发生溢出 0x03 溢出函数是怎样被调用的 相关调用链 首先是进入到DriverEntry(x,x),然后通过IrpDeviceIoCtlHandler(x,x)根据IoControlCode使用switch 函数跳转到BufferOverflowStackIoctlHandler然后进入TriggerBufferOverflowStack进行溢出操作 找到IrpIrpDeviceIoCtlHandler函数 首先,溢出了,我们最希望控制的就是EIP,通过溢出的漏洞将原来函数返回的地址覆盖为我们自己希望执行代码的地址。那么应该弄清楚一点,返回地址在哪?

    15720

    溢出学习笔记

    题外:复现蒸米师傅 《一步一步学 rop》 复现失败,猜测是的问题,我是调用 start 恢复的做法。 后面我就想通过 ret 到 printf 泄露出地址,再 ret 到 mian。这样就可以计算出地址。 因为输入长度限制,跪了,exp 如下: ? 这道题目的格式化字符串不是放在上而是放在 .bss 段中。 大佬告诉我要用一个跳板,上有指针什么是指向上的,我第一想到的就是 ebp ,反正不是打远程机。 其实两个两个字节写入比较好。 溢出 这种做法是 7o8v 师傅告诉我的,真的是刷新了我对溢出的看法。 首先爆破出 canary 的值。然后使用 '\x00' 使 login Success。 0x03 总结 1、 对知识点的理解不够深刻,花了一个月的时间尝试溢出 scanf("%d"),尝试使用格式化字符串漏洞修改 eip [笑哭] 2、 从 7o8v 师傅的 exp 中了解到溢出并不是只在输入发生的

    30600

    学PWN 溢出

    学PWN 溢出 https://zhuanlan.zhihu.com/p/25816426# 函数调用 程序运行时,内存一段连续的区域,用来保存函数运行时的状态信息,包括函数参数和局部变量 调用 从高地址向低地址生长 压时 地址变小 出时 地址变大 esp 顶指针 ebp 基指针 eip 下一条指令的地址 函数调用时: 参数按照逆序压 现代操作系统内存通常分段 函数调用( ,并将 PTR 存入 eip,格式为 CALL PTR; RET:返回指令,操作为将顶数据弹出至 eip,格式为 RET; 溢出攻击原理 攻击的时机:发生函数调用或者结束函数调用 攻击的方式:修改 控制程序执行指令的关键寄存器eip 的值 攻击的目标:让eip载入攻击指令的地址 让溢出数据用攻击指令来覆盖返回地址 攻击指令可以存在于溢出数据中,也可以是内存中的其它位置 返回地址 关闭地址随机化 2. shellcode有权限 在溢出数据内包含一段攻击指令 攻击指令一般是为了打开shell从而获得当前程序的控制权限 payload : padding1 + address of

    62120

    缓冲区溢出

    文章源自【字节脉搏社区】-字节脉搏实验室 作者-Jadore :先进后出 ? ? 动态调试下的: ? ? 几个寄存器: EAX:函数执行完后的返回结果 ECX:计数器 EDX、EBX:计算器 ESP:指向顶的指针 EBP:指向底的指针 ESI、EDI:源地址,目的地址寄存器 EIP:存储CPU要读取指令的地址 产生缓冲区溢出的几种可能: ? 整数溢出: 整数溢出可分为宽度溢出和算术溢出 宽度溢出:把一个宽度较大的操作数赋给宽度较小的操作数,就有可能发生数据截断或符号位丢失(分别对应以下两个例子): #include<stdio.h> int 、填补字符串pad、EBP基址、RET返回地址、跳转指令jumper、字符串结尾”\x00” * 2: ? ? 最后只需要与目标主机正常交互发送这些数据,尝试一次攻击得到一个反向shell: ? ?

    51330

    如何构造jvm的堆溢出溢出

    构造堆溢出溢出 Java虚拟机中描述了两种异常: 如果线程请求的深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常;—-溢出 如果在虚拟机中无法申请到足够多的内存空间 溢出 虚拟机用于存储局部变量表、操作数、常量池引用等信息。 所以想让溢出,我们只需要定义大量的局部变量,增大此方法帧中本地变量表的长度或者设置-Xss参数减少内存容量,又或者无限递归调用方法产生新的帧都会产生StackOverflowError异常 public class 溢出 { private int stackLength = 1; public void addStackLength(){ stackLength oom = new 溢出(); try { oom.addStackLength(); } catch (Throwable e

    53730

    MIPS-vuln_system溢出

    fclose(fp); } 首先分析程序逻辑得出 运行程序后从passwd中读取内容,判断是否为adminpwd 而读取数据的buf只有256大小,但是我们却可以在passwd中填充n个数据,因此便造成了溢出 为具体确定程序的溢出点,我们可以使用cyclic生成大量有序的字符输入到passwd中,再由程序读取passwd文件时因为溢出而引出的段错误来根据有序字符确定底距离$ra的大小 ? 之后在IDA中定位到这一段,可以看到首先是将空间减少了0x58的大小,意味着我们如果要用该gadget则至少要向伪造的空间中填充0x58个字符(包含binsh字符串)才可以保持堆栈平衡,其次要考虑的便是参数所处的位置 最后运行exp,在运行程序溢出反弹shell成功! ?

    25310

    PWN溢出漏洞。

    在国内的CTF比赛中,PWN题最常见考点就是缓冲区溢出漏洞,而缓冲区溢出代表就是溢出漏洞。 0x01 基础知识 是一种先进后出的数据结构,从高地址向低地址增长的内存结构。 0x02漏洞原理 溢出漏洞是由于使用了不安全的函数,如C中的 read(fd, buf, nbytes)、gets(s)等,通过构造特定的数据使得溢出,从而导致程序的执行流程被控制。 当构造变量char s[12]时,系统就在中给s开辟空间,可gets(s)函数未限制输入字符长度,可以构造大量的数据来超出变量的空间从而造成溢出,覆盖到s以上的空间。 ? 例举一道溢出的PWN题,根据解题步骤来解答。 1. 逆向工程: 将PWN题拖入IDA,点击程序入口函数。按F5逆向main函数,查看对应的C伪代码。 argc, char **argv) { vulnerable(); return 0; } gets() 是一个危险函数,因为它不检查输入字符串的长度,而是以回车来判断是否输入结束,所以很容易导致溢出

    51421

    PWN溢出漏洞。

    在国内的CTF比赛中,PWN题最常见考点就是缓冲区溢出漏洞,而缓冲区溢出代表就是溢出漏洞。 0x01 基础知识 是一种先进后出的数据结构,从高地址向低地址增长的内存结构。 0x02漏洞原理 溢出漏洞是由于使用了不安全的函数,如C中的 read(fd, buf, nbytes)、gets(s)等,通过构造特定的数据使得溢出,从而导致程序的执行流程被控制。 当构造变量char s[12]时,系统就在中给s开辟空间,可gets(s)函数未限制输入字符长度,可以构造大量的数据来超出变量的空间从而造成溢出,覆盖到s以上的空间。 ? 例举一道溢出的PWN题,根据解题步骤来解答。 1. 逆向工程: 将PWN题拖入IDA,点击程序入口函数。按F5逆向main函数,查看对应的C伪代码。 argc, char **argv) { vulnerable(); return 0; } gets() 是一个危险函数,因为它不检查输入字符串的长度,而是以回车来判断是否输入结束,所以很容易导致溢出

    64451

    Win下溢出示例

    例子来自《0day 安全:软件漏洞分析技术》 溢出 程序会读取目录下的 password.txt 然后复制到 buffer 中,然而 buffer 只有 8 字节,password 是 1024 字节的 在 OD 中给 verify_password 返回的时候下个断点,这样可以刚好在溢出发生之前给断下来 ? 机器码 汇编指令 注释 33DB XOR EBX,EBX 异或置零 53 PUSH EBX 作为字符串结束的截断符号 0 684841434B PUSH 4B434148 把 'HACK' 字符串进 Messagebox 33DB53684841434B8BC453505053B8EA07D577FFD0 然后可以填入一堆 90(也就是 NOP) 最后在 ret 的那个地方填入 0012FAF0(也就是顶 jmp esp 直接填入顶是需要我们自己去找顶的地址的,可以用 jmp esp 让他自己跳转到 esp 去执行 shellcode 可以用 OllyUni.dll 这个插件 https://bbs.pediy.com

    41851

    PCMAN FTP STOR命令溢出

    PCMAN FTP STOR命令溢出     继XX同学上个学期对PCMAN FTP这个软件进行了残暴的溢出测试(溢出点是FTP用户名,版本不清楚),我也开始学习逆向和溢出,谷歌上搜索pcman's 0x01 定位eip     溢出原理就是覆盖了的返回地址。 因为是从高地址向低地址延伸的,所以当产生溢出的时候,我们写在低地址的内容超出缓冲区大小,从而覆盖了高地址的eip的值,导致溢出。 ?     如上图是函数的,我们能控制的就是buffer[128],当我们输入的内容过长的时候,就能把后面的ebp、eip给覆盖掉。 我问了学长,是为了提高,避免shellcode中局部变量把代码破坏了……其实具体原理还是不太懂,以后再细细研究~     对PCMAN FTP的研究到一段落了,但溢出的冰山一角才开始出现在我眼前

    39010

    MIPS漏洞调试环境安装-溢出

    MIPS溢出 这一部分主要描述MIPS中的溢出相关的知识,假设大家已经有一定的x86漏洞利用经验。首先是介绍MIPS汇编的一些和x86不一样的地方,其次是一个简单溢出漏洞的利用。 但是没有EBP(底指针),进入一个函数时,需要将当前指针向下移动n比特,这个大小为n比特的存储空间就是此函数的帧存储存储区域。 利用堆栈溢出的可行性:在非叶子函数中,可以覆盖返回地址,劫持程序执行流程;而在非叶子函数中,可通过覆盖父函数的返回地址实现漏洞利用。 溢出实例 在有了前面的基础后,最后再介绍一个具体的实例。 首先是源代码,是书上的一个简单溢出的代码: #include <stdio.h>#include <sys/stat.h>#include <unistd.h>void do_system(int code \n"); } fclose(fp);} 可以看到溢出是对于输入的长度没有进行检查,同时代码中存在一个do_system函数,只要我们构造好参数,就可以利用。

    83150

    溢出场景的分析(2)

    之前一篇文章<<一种溢出的场景分析和建议>>中,本人分享了如何查找程序Crash的函数调用,然后通过代码审查找到溢出的原因。 当触发的溢出问题在非自己公司开发的第三方库中,无法获取源代码,也不易看出问题。 那么针对上面这两点,都需要一个东西去做辅助分析,那就是触发溢出的输入内容(这的所谓输入内容不是指用户在交互界面输入,而是指触发这个溢出的数据),无论是自己用这个输入内容来调试溢出的触发逻辑,或者是交给第三方库的支持方 这个程序是如何触发溢出的: 调用的函数是TriggerStackOverFlow 导致溢出的递归调用的函数是Func 这里特意设置的触发条件是当输入的数据为Data Trigger StackOverFlow 实际真实的工程代码也是类似,并不是溢出问题必现,而是在特定的情况下才会触发,这也是为什么本文强调的是如何获取触发溢出的输入数据如此重要,因为调试问题离不开它。

    20430

    一文读懂|溢出攻击

    帧 有 顶 和 底 之分,其中顶的地址最低,底的地址最高。SP(指针) 就是一直指向顶的。 ret 指令会从顶获取 返回地址,然后跳转到(jmp指令)此地址继续执行。这时的 帧 的结构如下图所示: 溢出攻击 前面说了那么,都是为了 溢出攻击 这节作铺垫的。 在编译上面程序时,一定要加上 -fno-stack-protector 参数,否则将会触发溢出保护,导致执行失败。 这就是 溢出攻击 的原理,而导致 溢出攻击 的原因就是:调用 memcpy()、strcpy() 等函数复制数据时,没有对数据的长度进行验证,从而 返回地址 被复制的数据覆盖了。 黑客可以利用 溢出攻击 来把函数的返回地址修改成入侵代码的地址,从而实现攻击的目的。

    48020

    关注

    腾讯云开发者公众号
    10元无门槛代金券
    洞察腾讯核心技术
    剖析业界实践案例
    腾讯云开发者公众号二维码

    相关产品

    • 全栈式风控引擎

      全栈式风控引擎

      腾讯云全栈式风控引擎(RCE)是针对电商、O2O、P2P、游戏、支付等行业在促销活动中遇到“羊毛党”恶意刷取优惠福利的行为时,通过防刷引擎,精准识别出“薅羊毛”恶意行为的活动防刷服务,避免了企业被刷带来的巨大经济损失。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券