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

【小白学C#】浅谈.NET中的IL代码

一、前言   前几天群里有位水友提问:”C#中,当一个方法所传入的参数是一个静态字段的时候,程序是直接到静态字段拿数据还是从复制的函数栈中拿数据“。...其实很明显,这和方法参数的传递方式有关,如果是引用传递的话,肯定是会去静态字段直接拿值的;如果方法是以传值的方式使用参数的话,一定是从复制的栈中拿值的。   ...四、浅析IL代码   好了,现在让我们回到博客最初抛出的那个问题上面来:“C#中,当一个方法所传入的参数是一个静态字段的时候,程序是直接到静态字段拿数据还是从复制的函数栈中拿数据?”...图7:Func2反编译出来的IL代码   可以看到,因为我们的C#代码中使用了ref参数,所以在IL代码中将其翻译成了int32& n的形式,和C++是不是很类似?   ...Conv.Ovf.I4 将位于计算堆栈顶部的有符号值转换为有符号 int32,并在溢出引发 OverflowException。

2.7K20

IL指令详细

Ckfinite 如果值不是有限数,则引发 ArithmeticException。 Clt 比较两个值。...Ldarg 将参数(由指定索引值引用)加载到堆栈上。 Ldarg.0 将索引为 0 的参数加载到计算堆栈上。 Ldarg.1 将索引为 1 的参数加载到计算堆栈上。...Ldarg.2 将索引为 2 的参数加载到计算堆栈上。 Ldarg.3 将索引为 3 的参数加载到计算堆栈上。 Ldarg.S 将参数(由指定的短格式索引引用)加载到计算堆栈上。...Ldobj 将地址指向的值类型对象复制到计算堆栈的顶部。 Ldsfld 将静态字段的值推送到计算堆栈上。 Ldsflda 将静态字段的地址推送到计算堆栈上。...Stobj 将指定类型的值从计算堆栈复制到所提供的内存地址中。 Stsfld 用来自计算堆栈的值替换静态字段的值。 Sub 从其他值中减去一个值并将结果推送到计算堆栈上。

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

Reflector、reflexil、De4Dot、IL指令速查表

Ckfinite 如果值不是有限数,则引发 ArithmeticException。 Clt 比较两个值。...Ldarg 将参数(由指定索引值引用)加载到堆栈上。 Ldarg.0 将索引为 0 的参数加载到计算堆栈上。 Ldarg.1 将索引为 1 的参数加载到计算堆栈上。...Ldarg.2 将索引为 2 的参数加载到计算堆栈上。 Ldarg.3 将索引为 3 的参数加载到计算堆栈上。 Ldarg.S 将参数(由指定的短格式索引引用)加载到计算堆栈上。...Ldobj 将地址指向的值类型对象复制到计算堆栈的顶部。 Ldsfld 将静态字段的值推送到计算堆栈上。 Ldsflda 将静态字段的地址推送到计算堆栈上。...Stobj 将指定类型的值从计算堆栈复制到所提供的内存地址中。 Stsfld 用来自计算堆栈的值替换静态字段的值。 Sub 从其他值中减去一个值并将结果推送到计算堆栈上。

1.7K50

IL指令速查

Ckfinite 如果值不是有限数,则引发 ArithmeticException。 Clt 比较两个值。...Ldarg 将参数(由指定索引值引用)加载到堆栈上。 Ldarg.0 将索引为 0 的参数加载到计算堆栈上。 Ldarg.1 将索引为 1 的参数加载到计算堆栈上。...Ldarg.2 将索引为 2 的参数加载到计算堆栈上。 Ldarg.3 将索引为 3 的参数加载到计算堆栈上。 Ldarg.S 将参数(由指定的短格式索引引用)加载到计算堆栈上。...Ldobj 将地址指向的值类型对象复制到计算堆栈的顶部。 Ldsfld 将静态字段的值推送到计算堆栈上。 Ldsflda 将静态字段的地址推送到计算堆栈上。...Stobj 将指定类型的值从计算堆栈复制到所提供的内存地址中。 Stsfld 用来自计算堆栈的值替换静态字段的值。 Sub 从其他值中减去一个值并将结果推送到计算堆栈上。

1.6K70

IL指令详细表

Ckfinite 如果值不是有限数,则引发 ArithmeticException。 Clt 比较两个值。...Ldarg 将参数(由指定索引值引用)加载到堆栈上。 Ldarg.0 将索引为 0 的参数加载到计算堆栈上。 Ldarg.1 将索引为 1 的参数加载到计算堆栈上。...Ldarg.2 将索引为 2 的参数加载到计算堆栈上。 Ldarg.3 将索引为 3 的参数加载到计算堆栈上。 Ldarg.S 将参数(由指定的短格式索引引用)加载到计算堆栈上。...Ldobj 将地址指向的值类型对象复制到计算堆栈的顶部。 Ldsfld 将静态字段的值推送到计算堆栈上。 Ldsflda 将静态字段的地址推送到计算堆栈上。...Stobj 将指定类型的值从计算堆栈复制到所提供的内存地址中。 Stsfld 用来自计算堆栈的值替换静态字段的值。 Sub 从其他值中减去一个值并将结果推送到计算堆栈上。

2K20

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

在研究负责处理来自服务器的DHCP响应中的所有选项的DhcpExtractFullOptions函数,特别是调用UpdateDomainSearchOption的选项,我们注意到了堆栈上的两个数组,...每个数组包含256个元素: 没有任何检查限制这些数组的迭代器值的迹象。...我们把它放在一个反汇编程序中,计算出那些未完全解析的代码片段,并试图找出这两个静态数组的用途。...因此,all_tags数组存储来自接收消息选项的标记,unknown_tags数组仅包含解析器未知的选项标记,除此之外,它根本没有检查数组的索引。...首先,选项标记的大小为一个字节,数组元素的类型为int,这意味着元素大小为四个字节。 因此,我们有一个溢出,我们控制每个第四个字节,其余的在覆盖归零。

58910

扒掉“缓冲区溢出”的底裤

文章原题《缓冲区溢出》 ? 1 引言 “缓冲区溢出”对现代操作系统与编译器来讲已经不是什么大问题,但是作为一个合格的 C/C++ 程序员,还是完全有必要了解它的整个细节。...简单的说,缓冲区就是一块连续的计算机内存区域,它可以保存相同数据类型的多个实例,如字符数组缓冲区溢出则是指当计算机向缓冲区内填充数据位数超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。...但是只有静态的代码段和数据段是不够的,进程在运行过程中还要有其动态环境。 一般说来,默认的动态存储环境通过堆栈机制建立。所有局部变量及所有按值传递的函数参数都通过堆栈机制自动分配内存空间。如下图。...栈由编译器自动管理,其分配方式有两种:静态分配和动态分配。静态分配由编译器完成,比如局部变量的分配。...当调用函数,新的栈帧被压入栈;当函数返回,相应的栈帧从栈中弹出。由于需要将函数返回地址这样的重要数据保存在程序员可见的堆栈中,因此也给系统安全带来了极大的隐患。

1.1K20

缓冲区溢出

来源:公众号(c语言与cpp编程) 1 引言 “缓冲区溢出”对现代操作系统与编译器来讲已经不是什么大问题,但是作为一个合格的 C/C++ 程序员,还是完全有必要了解它的整个细节。...简单的说,缓冲区就是一块连续的计算机内存区域,它可以保存相同数据类型的多个实例,如字符数组缓冲区溢出则是指当计算机向缓冲区内填充数据位数超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。...但是只有静态的代码段和数据段是不够的,进程在运行过程中还要有其动态环境。 一般说来,默认的动态存储环境通过堆栈机制建立。所有局部变量及所有按值传递的函数参数都通过堆栈机制自动分配内存空间。如下图。...栈由编译器自动管理,其分配方式有两种:静态分配和动态分配。静态分配由编译器完成,比如局部变量的分配。...当调用函数,新的栈帧被压入栈;当函数返回,相应的栈帧从栈中弹出。由于需要将函数返回地址这样的重要数据保存在程序员可见的堆栈中,因此也给系统安全带来了极大的隐患。

2K10

C语言缓冲区溢出详解

wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1] 1 引言 “缓冲区溢出”对现代操作系统与编译器来讲已经不是什么大问题,但是作为一个合格的 C/C++ 程序员...简单的说,缓冲区就是一块连续的计算机内存区域,它可以保存相同数据类型的多个实例,如字符数组缓冲区溢出则是指当计算机向缓冲区内填充数据位数超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。...但是只有静态的代码段和数据段是不够的,进程在运行过程中还要有其动态环境。 一般说来,默认的动态存储环境通过堆栈机制建立。所有局部变量及所有按值传递的函数参数都通过堆栈机制自动分配内存空间。如下图。...栈由编译器自动管理,其分配方式有两种:静态分配和动态分配。静态分配由编译器完成,比如局部变量的分配。...当调用函数,新的栈帧被压入栈;当函数返回,相应的栈帧从栈中弹出。由于需要将函数返回地址这样的重要数据保存在程序员可见的堆栈中,因此也给系统安全带来了极大的隐患。

2.3K2219

递归的递归之书:引言到第四章

递归算法可能难以理解,性能较差,并容易导致堆栈溢出错误。某种类型的程序员可能使用递归,并不是因为它是解决特定问题的正确技术,只是因为他们觉得当他们编写其他程序员难以理解的代码更聪明。...如果没有基本情况,函数永远不会停止进行递归调用,最终导致堆栈溢出。如果没有递归情况,函数永远不会调用自身,只是一个普通函数,不是递归函数。...编程问题的三个特征,当存在,使其特别适合递归方法: 它涉及树状结构。 它涉及回溯。 它并不是如此深度递归,以至于可能导致堆栈溢出。...但是head的数据类型只是一个单一的数字值,不是一个带有一个数字值的数组。...泛洪填充算法不一定要是递归的。对于大图像,递归函数可能会导致堆栈溢出。如果我们使用循环和堆栈来实现泛洪填充堆栈将以起始像素的 x 和 y 坐标开始。

51810

关于缓冲区溢出攻击,这份防范策略一定要收好!

缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据超过了缓冲区本身的容量,导致数据溢出到被分配空间之外的内存空间...缓冲区可以设在:堆栈(自动变量)、堆(动态分配的)和静态数据区(初始化或者未初始化的数据)等的任何地方。也可以不必为达到这个目的溢出任何缓冲区,只要找到足够的空间来放置这些攻击代码就够了。 ​...执行溢出这些自动变量,使这个返回的地址指向攻击代码,再通过改变程序的返回地址。当函数调用结束,程序就会跳转到事先所设定的地址,不是原来的地址。这样的溢出方式也是较常见的。...(2)软件开发过程中的防范策略 发生缓冲区溢出的主要及各要素是:数组没有边界检查导致的缓冲区溢出;函数返回地址或函数指针被改变,使程序流程的改变成为可能;植入代码被成功的执行等等。...使用的机器堆栈压入数据向高地址方向前进,那么无论缓冲区如何溢出,都不可能覆盖低地址处的函数返回地址指针,也就避免了缓冲区溢出攻击。但是这种方法仍然无法防范利用堆和静态数据段的缓冲区进行溢出的攻击。

1.7K20

缓冲区溢出 攻击 「建议收藏」

-z execstack 用于允许执行栈。 -g 参数是为了使编译后得到的可执行文档能用 gdb 调试。 从逻辑上讲进程的堆栈是由多个堆栈帧构成的,其中每个堆栈帧都对应一个函数调用。...当函数调用发生,新的堆栈帧被压入堆栈;当函数返回,相应的堆栈帧从堆栈中弹出。...缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据超过了缓冲区本身的容量,导致数据溢出到被分配空间之外的内存空间...缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到...2、溢出地址,是触发shellcode的关键所在。 3、填充物,填充未使用的缓冲区,用于控制溢出地址的位置,一般使用nop指令填充——0x90表示。

1.1K30

使用memset初始化数组

写在前面的ATTENTION:用memset初始化非char型(eg. int型、float型…)数组,假如初始化值非0,可能导致错误的结果。...注意到,memset填充内存,是以byte为单位的,上面例子中的int型数组每个元素就占了4bytes,故而填充后的值就是0x01010101了。...此外,memset的参数value,虽然是int型,但是会将其转换为unsigned char再进行填充,这样才能跟byte对应上。...如果设置的value超过了unsigned char的表示范围,就溢出了,例如这样memset(arr, 256, sizeof(int) * 5),得到的结果反而与memset(arr, 0, sizeof...int变量的默认值,假如是全局变量或静态局部变量则为0,假如是局部变量则为随机值(C语言规范中未作要求)。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

1.8K30

堆栈基础(一)

在大多数我们称运行时栈为:堆栈。...push / pop操作 运行时栈是有cpu直接管理的内存数组, 它使用连个寄存器,ss和esp(32是esp,16位是sp,64位是rsp), ss寄存器存放的段地址,esp是堆栈指针寄存器,指向最后压入到堆栈上的数据...:将参数从右向左依次压入系统栈中 返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回继续执行 代码区跳转:处理器从当前代码区跳转到被调用函数的入口处 栈帧调整:具体包括保存当前栈帧状态值...函数调用时栈内的数据从高地址到低地址分别是函数参数入栈(从右到左),返回地址入栈,ebp入栈,esp分配填充地址, 局部变量mov入栈。..._chkesp> mov esp,ebp ret 将这段代码的所有汇编一步一步跟踪了解清楚了后,对堆栈算是大概了解了,下面就是入门栈溢出了,之后学到栈溢出再来更新。 -END-

68760

目前CSDN上最全面的C语言讲解如何用更高层次编写嵌入式C代码

由于数组DataBuf为局部变量,被分配在堆栈中,同在此堆栈中的还有中断发生的运行环境以及中断返回地址。溢出的数据将这些数据破坏掉,中断返回PC指针可能变成一个不合法值,硬件异常由此产生。...gets()函数内部定义了一个500字节的数组,攻击者发送了大于500字节的数据,利用溢出的数据修改了堆栈中的PC指针,从而获取了系统权限。...volatile限定符用来告诉编译器,该对象的值无任何持久性,不要对它进行任何优化;它迫使编译器每次需要该对象数据内容都必须读该对象,不是只读一次数据并将它放在寄存器中以便后续访问之用(这样的优化可以提高系统速度...使用了多少堆栈,是否溢出? 2.4.5 有多少RAM会被初始化?...这里建议使用良好的编码样式和清晰的命名来减少注释,对模块、函数、变量、数据结构、算法和关键代码做注释,应重视注释的质量不是数量。

2.1K21

溢出

可能需要参数,所以溢出数据也要包括必要的参数。...padding2 数据长度为4(32位机时)可随意填充 address of “/bin/sh” 是字符串“/bin/sh”在内存中的地址,作为传给system()的参数   要解决的问题: 1返回地址之前的填充数据...ebx 被称为基址寄存器(Base),在内存寻址(比如数组运算)用以存放基地址。 ecx 被称为记数寄存器(Counter),用以在循环过程中记数。...如果要用 pop 指令来传输调用参数,就需要在溢出数据内包含这些参数,所以上面的溢出数据格式需要一点修改。对于单个 gadget,pop 所传输的数据应该在 gadget 地址之后。   ...程序对外部函数的调用需要在生成可执行文件将外部函数链接到程序中,链接的方式分为静态链接和动态链接。

1.2K20

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

缓冲区溢出   缓冲区溢出是指计算机向缓冲区内填充数据位数超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符。...操作系统所使用的缓冲区,又被称为“堆栈”,在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。 3....在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。缓冲区溢出中,最为危险的是堆栈溢出。...(so==share object)在程序的链接时候并不像静态库那样在拷贝使用函数的代码,只是作些标记。然后在程序开始启动运行的时候,动态地加载所需模块。...在函数fun中,fun函数根据传入的参数i来初始化a数组。显然,i的值只能为0和1。在fun函数中,同时还设置了d的值为3.14。当我们给fun函数传入0和1可以打印出正确的结果3.14。

1.1K10

5.10 汇编语言:汇编过程与结构

过程的实现离不开堆栈的应用,堆栈是一种后进先出(LIFO)的数据结构,最后压入栈的值总是最先被弹出,新数值在执行压栈总是被压入到栈的最顶端,栈主要功能是暂时存放数据和地址,通常用来保护断点和现场。...在使用堆栈传参和创建局部变量,需要谨慎考虑栈指针的位置,并确保遵守调用约定以确保正确地传递参数和返回值。...---- 接着我们继续来对比一下堆栈参数传递的异同点,平栈的方式一般可分为调用者平栈和被调用者平栈,在使用堆栈传参,需要平衡栈以恢复之前的堆栈指针位置。...,第二个MyProcB函数则是调用者平栈,该方式在函数内部并没有返回任何参数,所以在调用函数结束后需要通过add esp,4的方式对堆栈进行修正。...在填充数组,分别使用了两种不同的方式。一种方式是使用lea指令将数组的地址加载到esi寄存器中,然后使用mov dword ptr ds:[esi],10等指令将相应的常数值存储到数组中。

18320
领券