首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

通过逆向和调试深入EVM #5 - EVM如何处理 ifelseforfunctions

因此,我们可以很容易地推断出,如果堆栈第一个参数是 0,那么 EVM 将跳到 4b(十进制 75),否则 EVM 将继续执行流程。...带返回函数调用 现在,让我们看看如果 flow2 函数不接受参数而返回一个会发生什么。 剧透:想法是一样,区别也是很小。...在 117 直接处堆栈是(61 和 5)。 61,我们已经知道了其作用,但是 5 是什么?你可能猜到了。这是该函数返回 你可能已经注意到了,返回也被推到了堆栈中。...在执行 flow2()之后,flow 函数仍将继续,堆栈是相同(如前所述),但是 5 ! 7. 让我们把它放在一起 最后,这是这篇文章最后一个例子。...关于这个函数没有什么可说,这种行为是预期。参数、保存字节和返回都存储在堆栈中,该函数已经正确完成了工作。 那么,你需要记住什么? 当你在 solidity 中调用一个函数时(在汇编中)。

49320

面试官不讲武德,居然让讲讲蠕虫和金丝雀!

缓冲区溢出一个常见后果是:黑客利用函数调用过程中程序返回地址,将存放这块地址指针精准指向计算机中存放攻击代码位置,造成程序异常中止。...第一个缓冲区溢出攻击--Morris蠕虫,发生在二十年前,它曾造成了全世界6000多台网络服务器瘫痪。   ...因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序地址,让其跳转到任意地址。带来危害有两种,一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。...将金丝雀存放在一个特殊段中,标记为只读,这样攻击者就不能覆盖存储金丝雀。在恢复寄存器状态和返回前,函数将存储在栈位置处与金丝雀做比较(通过第10行xorq指令)。...如果两个数相同,xorq指令就会得到0,函数会按照正常方式完成。非零表明栈上金丝雀被修改过,那么代码就会调用一个错误处理例程。   栈保护很好地防止了缓冲区溢出攻击破坏存储在程序栈上状态。

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

二进制漏洞学习笔记

第一个关掉就是 ASLR 简单讲,这个保护开启之后,程序堆栈地址在程序每次启动时候都是随机。 想要了解详情可以百度。 ?...简单讲,开启Canary之后,函数开始时在ebp和临时变量之间插入一个随机函数结束时验证这个。如果不相等(也就是这个被其他覆盖了),就会调用 _stackchk_fail函数,终止进程。...简单讲,每个函数在调用时候,都会在栈开辟一段新空间,esp指向栈顶部,ebp指向栈底部,esp和ebp中间就是储存一些参数和临时变量,紧接着ebp下面就是函数返回地址。...那么,我们要是精心构造我们输入,我们就可以控制其他变量,改变ebp(ebp里面的保存是上一个函数ebp),甚至使函数返回到任意地址(控制eip)。这就是栈溢出利用了。...下面附上一张函数栈帧示意图 ? 那么,一个问题来了,要怎么才能知道需要覆盖多少数据才能覆盖到返回地址去控制程序流程呢?

94401

利用 CDE 中格式字符串漏洞

很确定你可以。其实不止 在这里发现一个错误。CDE 开发人员设法实现了真正目标 了不起:我们有两个错误一个价格,都在同一行 代码!基于堆栈缓冲区溢出*和*格式字符串错误。...不 提到其他与 sprintf() 相关缓冲区溢出......哇。这真的是 另一个时代代码。 已经编写了一些针对这些错误漏洞利用 [7]。在英特尔,是 能够利用缓冲区溢出和格式字符串错误。...遇到问题,如前所述,与SPARC有关 堆栈布局。当利用经典基于堆栈缓冲区溢出时 SPARC 我们不能覆盖当前函数保存返回地址, 但我们只能覆盖调用者保存返回地址 当前功能。...实际上,这意味着易受攻击程序 在我们劫持 %pc 之前需要在一个额外函数中存活下来。 根据目标,利用基于堆栈缓冲区溢出 SPARC 可能很容易、很难或几乎不可能。...在这种特殊情况下, 许多重要变量会在返回途中被覆盖 地址和易受攻击程序将不会轻易生存,直到 调用者函数返回。出于这个原因,决定专注于利用 而是格式字符串错误

1.4K20

CVE-2019-0697:通过DHCP漏洞发现其余两个关键漏洞

函数执行开始时,数组及其迭代器被清零: 该函数解析从DHCP服务器接收数据包中所有选项,从中收集信息并对其进行处理。...从ParseDhcpv4Option返回后,当前选项option_tag标识符将写入all_tags数组一个元素,即我们正在查看第一个数组。...因此,这些索引可能超过256,并导致在堆栈上为阵列分配内存之外进行写入。要导致第一个阵列溢出,DHCP服务器发送超过256个选项数据包就足够了。...当然,创建类似可用漏洞需要攻击者付出巨大努力。在系统上由于所有现代保护机制,缓冲区堆栈溢出一个复杂且难以利用漏洞。...另一方面,我们不要忘记所有这些机制都保护返回地址和异常处理程序不被覆盖,防止在未分配内存位置中执行代码,或者阻止预测地址。但是,它们无法阻止在溢出缓冲区和返回地址之间覆盖存储在堆栈局部变量。

58910

如何编写高质量 JS 函数(1) -- 敲山震虎篇

大家可以自行思考一下,有些越简单道理,背后越是有着非凡思想。 (4)将字符串变成真正 JS 代码 每一个函数调用,都会在函数上下文堆栈中创建帧。栈是一个基本数据结构。...第四步:在这个新开辟作用域中自上而下执行。 思考题:为什么是自上而下执行呢? 将执行结果返回给当前调用函数 思考题:将执行结果返回给当前调用函数,其背后是如何实现呢?...,而且由于 kun 函数只执行了一次,导致了 i 最后结果,也就是 10 。...每个 AO(kun) 节点中 i 也是不一样。 所以输出结果最后显示为 0 到 9 。 六、总结 通过对底层实现原理分析,我们可以更加深刻去理解函数执行机制,从而写出高质量函数。...每一次执行函数,都会创建函数执行环境,也就意味着占用一些栈内存,而栈内存大小是固定,如果写了很大递归函数,就会造成栈内存溢出,引发错误

1.3K20

【Pod Terminating原因追踪系列之二】exec连接未关闭导致事件阻塞

,append方法负责将收到containerd事件放入eventQ,并执行回调函数,对收到不同类型事件进行处理: func (q *queue) append...这也就解释了为什么每次publish新对于同一个containerexit事件,都会在堆栈中增加一条append堆栈信息,因为它们都被之前一个事件阻塞住了。...深入源码定位问题原因 为了找到阻塞原因,我们找到阻塞第一个exit事件append堆栈信息再详细看一下: [h3hzww0kzr.png] 通过堆栈可以发现代码卡在了docker/daemon/...return nil} 可以看到收到事件为exit事件,并在第123行streamConfig在等待一个wg,这里streamconfig为一个内存队列,负责收集来自containerd输出返回给客户端...最后我们通过分析代码和堆栈信息,最终定位在ProcessEvent由于pools.Copy阻塞,也会被阻塞,直到copy结束,而事件又是串行处理,因此只要有一个事件处理被阻塞,那么后面所有的事件都会被阻塞

2.5K108

再看JavaScript,那些遗漏或易混淆知识点(3)

普通递归函数因为涉及到了计算,所以会等最后一个深度函数执行完成在回过来执行上一个函数,然后依次释放执行过函数内存空间,所以会存在最大深度问题。...total : pow2(x, n - 1, x * total) } console.log(pow2(2, 4)); 如果 n 足够大,你会发现还是会报出栈溢出错误,并没有进行尾调用优化。...执行上下文和堆栈 递归函数在调用时候为什么会存在 栈溢出 情况?就是因为递归函数在执行时候都是先执行都是没有被计算,仅仅只是保留在执行上面文中,等待后面的计算完成在返回来计算之前。...创建函数语法: let func = new Function ([arg1, arg2, ...argN], functionBody); 最后一个函数函数体,如果只有一个参数,那他就是函数体。...第二点就是这两个函数返回返回一个 timerID ,是一个 number 类型

72920

01- JavaScript 调用堆栈

让我们打破之前定义: LIFO:当我们说调用堆栈是按照后进先出数据结构原理进行操作时,这意味着当函数返回时,被压入堆栈最后一个函数第一个弹出函数。...你会注意到,函数作为堆栈排序开始于 firstFunction() 这是进入堆栈最后一个函数,并且以抛出错误弹出,然后就是 secondFunction(),然后就是 thirdFunction()...这是第一个函数在执行代码时候将其压入堆栈。...临时存储 调用一个函数时,该函数,其参数和变量将被推入调用堆栈以形成堆栈框架,该堆栈堆栈内存位置。当函数返回时(从栈弹出),将清除内存。 ? ?...是什么导致堆栈溢出? 当存在没有出口点递归函数(调用自身函数)时,将发生堆栈溢出

1.3K20

JVM源码分析之javaagent原理完全解读

先上两张图 内存态线程堆栈 线程堆栈 存疑点 仔细看看上面的线程dump分析和内存dump分析里线程分析模块,您可能会有如下两个疑惑: 【为什么线程[Thread-0]一直卡在Class.forName...位置】:这有点出乎意料,做一个类加载要么找不到抛出ClassNotFoundException,要么找到直接返回为什么一直卡在这个位置呢?...java.sql.DriverManager.registerDriver来实现(注意这个方法加了synchronized关键字,后面解释第一个疑惑时候是关键),而这个方法在第一次执行过程中,会在当前线程...感想: 其实觉得这种设计有点傻,为什么要干和自己不相关事情呢,画蛇添足设计,首先类初始化开销是否放到一起做并没有多大区别,其次正由于这种设计导致了今天这个死锁发生 疑惑一: 现在来说第一个疑惑...,就知道它在干什么了,但是很遗憾,这个很难获取到,至少一直没有找到办法,因为线程ID在线程对象里一直没有存,都是调用os函数来获取,得换个思路。

1.5K40

通过POC来学习漏洞原理

0x03 poc 简单介绍 本文我们不研究怎么写 poc,当然我会在最后给大家介绍一下 寻蛋(egghunter) 这种 exp 开发技术,打算通过已经写好 exp 来给大家反向讲解一下这个漏洞成因及原理...emmmmm…… 看来我们想法是对,程序断在了 recv() 函数入口,注意看堆栈窗口有一堆 aaaaaaaaaaa,那就是我们构造 get 请求中 path 参数,接下来就要说明一下这个栈溢出漏洞根本原因了...,我们可以看到函数入口这样一条汇编 sub esp 124 就是开辟了一个 292 字节栈空间(124 是十六进制),get 请求中 path 参数,也就是 exp 中 buf ,就存放在这个空间中...而这个漏洞产生原因就是没有对 path 参数,也就是 buf 进行长度校验,以致于我们可以构造超长字符串从而覆盖这个处理函数返回地址进而对程序执行流程进行劫持。...要解决这个问题,我们要以一个开发者思维来考虑,当一个 get 请求来时候,我们肯定会创建一个堆区来保存 path,Host,Authorization 这些字段,据我开发经验 c/c++ 对堆使用函数

75300

美团一面:为什么线程崩溃崩溃不会导致 JVM 崩溃

大家好,是坤哥 网上看到一个很有意思美团面试题:为什么线程崩溃崩溃不会导致 JVM 崩溃,这个问题看了不少回答,但发现都没答到根上,所以决定答一答,相信大家看完肯定会有收获,本文分以下几节来探讨...,那么操作系统会执行默认信号处理程序(一般最后会让进程退出),但如果注册了,则会执行自己信号处理函数,这样的话就给了进程一个垂死挣扎机会,它收到 kill 信号后,可以调用 exit() 来退出,...和 NPE,这就是为什么 JVM 不会崩溃且我们能捕获这两个错误/异常原因 如果针对 SIGSEGV 等信号,在以上函数中 JVM 没有做额外处理,那么最终会走到 report_and_die...这个方法,这个方法主要做事情是生成 hs_err_pid_xxx.log crash 文件(记录了一些堆栈信息或错误),然后退出 至此相信大家明白了为什么发生了 StackoverflowError...,针对 stackoverflow 其实它采用了一种栈回溯方法保证线程可以一直执行下去,而捕获空指针错误主要是这个错误实在太普遍了,为了这一个很常见错误而让 JVM 崩溃那线上 JVM 要宕机多少次

2K20

攻击本地主机漏洞(中)

堆栈金丝雀用于在执行恶意代码之前检测缓冲区溢出堆栈保护)。程序启动时,将生成一个随机整数,并将其放置在堆栈顶部,正好位于堆栈返回指针之前。...子例程是较大程序一部分,包括一组执行任务指令。可以使用库函数,而不是将恶意负载写入堆栈,恶意程序可以使用其条目位置覆盖返回地址。...您刚刚溢出了输入缓冲区,并在程序中创建了一个分段错误。...注:计算机通过寄存器管理堆栈。寄存器作为内存中专用位置,在使用数据时存储数据。大多数寄存器临时存储用于处理。在堆栈中存储最后一个程序请求地址小寄存器称为堆栈指针。...接下来,继续并退出gdb,然后让我们生成随机模式,并将其用作易受攻击程序参数。在命令行中执行以下命令: 您应该会收到预期分段错误(SIGSEGV)。

1.4K20

Caché 变量大全 $ECODE 变量

$ECODE还可以包含与Caché General System错误代码相同错误代码(在终端提示符处返回到$ZERROR特殊变量错误代码)。...(这与早期$ECODE行为不同,在早期$ECODE行为中,旧错误堆栈一直存在,直到被显式清除。) 如果有多个错误代码,Caché会按照收到顺序,在当前$ECODE末尾追加每个错误代码。...它对现有的$ZERROR没有影响。 它会为作业清除错误堆栈。这意味着对$STACK函数后续调用返回当前执行堆栈,而不是最后一个错误堆栈。 它影响$ETRAP错误处理程序错误处理控制流。...$ECODE字符串溢出 如果$ECODE中累积字符串长度超过512个字符,导致字符串溢出错误代码将清除并替换$ECODE中的当前错误代码列表。...在这种情况下,$ECODE中错误列表是自最近一次字符串溢出以来错误列表,从导致溢出错误开始。 注意 创建自己错误代码 $ECODE特殊变量格式是由一个或多个错误代码组成逗号包围列表。

95920

Android Native Crash 收集

IO异常也会发出 #define SIGBUS 7 // 非法地址,包括内存地址对齐出错,比如访问一个4字节整数, 但其地址不是4倍数 #define SIGFPE 8 // 计算错误,比如除0、溢出...通常程序如果终止不了,才会尝试SIGKILL #define SIGSTKFLT 16 // 协处理器堆栈错误 #define SIGCHLD 17 // 子进程结束时, 父进程会收到这个信号。...设置紧急栈空间 如果当前函数发生了无限递归造成堆栈溢出,在统计时候需要考虑到这种情况而新开堆栈否则本来就满了堆栈又在当前堆栈处理溢出信号,处理肯定是会失败。...可以使用_Unwind_GetIP()函数将当前函数调用栈中每个函数绝对内存地址(也就是上文中提到 pc ),写入到_Unwind_Context结构体中,最终返回是当前调用栈全部函数地址了,...;如果当前函数发生了无限递归造成堆栈溢出,在统计时候需要考虑到这种情况而新开堆栈否则本来就满了堆栈又在当前堆栈处理溢出信号,处理肯定是会失败;再比方说多进程多线程在 C 上各种问题,真的是很复杂

2.2K10

初识函数栈帧创建与销毁(笔记)

函数返回后,又会通过调整ESP寄存器来释放堆栈空间。 4. 返回地址:返回地址是指函数调用完成后要返回指令地址。...栈溢出是一种常见编程错误,可能会导致程序意外终止或行为异常。避免栈溢出方法包括使用堆分配内存或优化函数栈帧大小等。...指向下一个空闲位置 最后,当函数栈帧被销毁后,栈顶指针(ESP)会指向函数调用者一个空闲位置,以便继续执行调用者函数代码。 三、优化方法 1....形参是在压栈时候开辟空间,它和实参只是上是相同,空间是独立 所以形参是实参一个拷贝,改变形参不会影响实参 5.函数调用是结束后怎么返回?...,就能找esp顶,下一个空间 我们记住了call指令下一条地址,当我们往回返时候, 就可以转到call指令下一条指令地址,让函数返回 返回是通过寄存器带回来 函数返回是指向形参指针时候

11810

汇编和栈

一旦栈达到内核给定有限大小,或者如果栈越过了堆边界,则称栈溢出。这是一个致命错误,通常称为栈溢出。 # 栈指针和基本指针寄存器 您尚未了解两个非常重要寄存器是 RSP 和 RBP。...例如,如果没有相应 pop 消息用于弹出,则当在函数末尾执行 ret 时将弹出错误。 该操作将返回到某个随机位置,甚至可能不在程序中有效位置。...请注意 RSP 寄存器中差异。 RSP 指向现在将包含前一个函数返回地址。...嗯,如您所知,在调用指令期间,返回地址被压入堆栈。然后,在函数序言中,将基本指针压入堆栈,然后将基本指针设置为堆栈指针。 您还没有学到是,编译器实际上会在堆栈上留出 “暂存空间” 空间。...您可能想知道为什么它不能只是 RDI,因为那是将传递给函数地方,并且它也是第一个参数。 好了,RDI 稍后可能需要在函数中重用,因此使用堆栈是更安全选择。

3.2K20

【Linux】进程信号 --- 信号产生 保存 捕捉递达

下面介绍一个接口叫做signal,它可以用来捕捉对应信号,让进程在递达处理信号时不再遵循默认动作,而是按照我们所设定方法函数进行递达处理,这个自定义方法函数就是handler,signal第二个参数其实就是接收返回为...signal函数返回我们一般不关注,signal函数调用成功时返回handler方法函数指针,调用失败则返回SIG_ERR宏。...所以操作系统就会知道当前在CPU上运行进程导致CPU出现计算错误了,并且CPU计算错误是由于溢出,那么此时操作系统就会给对应进程发送8号信号SIGFPE,进程收到该信号后,在合适时候会处理这个信号,...b.由于pending位图中比特位只能被置1一次,所以如果某一个进程多次收到同一类型普通信号,这就意味着除第一个普通信号外,剩余普通信号都将被丢失(信号丢失也不是什么坏事,他是个中义词)。...有很多人喜欢把栈叫做堆栈空间,堆栈空间大小是有限制,如果函数调用层数过多,比如递归,此时堆栈空间是有可能发生stack overflow堆栈空间溢出,所以在调用函数时要注意递归写法,递归展开太多的话

1.5K10

函数栈帧(超详细)

前言 在我们学习语言时候,我们可能会有很多困惑,比如局部变量时真么创建为什么局部变量时随机函数如何传参,传参顺序又是怎样,关于这些,我们就要去学习函数栈帧这个知识点,才能让这些变得更加简单易懂...栈区域是一种后进先出(LIFO,Last In First Out)数据结构,也就是说,最后进入栈中元素会第一个被弹出。...当一个函数在执行时,它会在栈中分配一段空间,用来存储该函数局部变量、参数、返回等相关信息,这就是函数栈帧。...当函数递归调用时,每一个函数调用都会在栈中分配一段新空间,用来存储该函数局部变量、参数等信息。这种机制可以确保程序在递归调用时不会出现栈溢出问题。...以下是一些常见排查方法和可能遇到问题: 3.1栈溢出(Stack Overflow): 当函数栈帧深度过大或者过多局部变量导致栈空间溢出时,会引发栈溢出错误

13610
领券