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

为什么在x86程序集中将NOP指定为0x90?

相关·内容

x86_64运行时动态替换函数的hotpatch机制

这是一个很有意思的选项,其实编译器提供这个机制也是举手之劳吧,虽然简单,但它确实为程序员HOOK运行中的函数提供了很大的方便。...0x90代表一个nop指令,即 “什么也不做”的意思,如此一来,程序员便非常容易将类似下面的指令插入到函数开头了: ? 无需任何额外的指令保存动作。 既然微软的编译器有这个功能可用,GCC有没有呢?...看了GCC的manual,发现了一个-mhotpatch=x,y的选项,但是x86平台不能用,还是比较不爽的。...为什么不用kprobe机制呢?kprobe的原理是 为了灵活性,使用int 3令替换被hook的指令。...可能很多平台并没有类似独立的0x90令吧。不过既然有,那还是0x90纯粹些。 kprobe也不全部一来int 3,只有return hook的场景才依赖int 3,其它的也可以做jmp hook。

1.1K10

一条指令引发的血案···

PS:esp是x86架构CPU的栈指针寄存器,rsp是x64架构CPU的栈指针寄存器。x64兼容了x86,可以通过esp访问rsp的低32位。...由于前面正好有一堆nop,于是将紧邻着的一个nop0x90改为0x48,这样一来,就把add esp, 298h这条指令,改成了add rsp, 298h了。...保存,然后成功修复了~然后很得意的群里吹水去了~ 但事情并没有结束。过了几天总结文档时,突然意识到:不对!有问题! 修复程序的当时我给开发那边给出了一个解释,是恢复栈指针时出现了错误导致堆栈不平衡。...风哥建议下又分析了一次。先找出之前的程序崩溃转储,用windbg再看看有没有什么蛛丝马迹。 dump分析出来是这个样子的: 经典的0xC0000005 错误码。但除此之外也似乎没有别的问题了?...等等,还有个问题:为什么win7下能正常跑?这个规则是指令规范,win7下应该也是一样的吧?

8610
  • Windows应用程序调试原理全景图

    导言 本文总计八千余字,十余张图,浏览时间较长,建议先mark 探索调试器下断点的原理 Windows上做开发的程序猿们都知道,x86架构处理器有一条特殊的指令——int 3,也就是机器码0xCC,...因此,经常我们的程序发生缓冲区溢出时,会看到大量的“烫烫烫…”,这是因为“烫”的编码正是两个0xCC。   那么?为什么int 3可以让程序中断到调试器呢?...nop指令,也就是5个0x90。...读取到的内容是0x90,正是第一个nop指令。现在我们把光标定在第一个nop那一样,按下F9,设置一个断点。然后使用F5调试运行,输出的内容如下: ?...可以看到,调试状态下读取到的内容成了0xCC,就是一条int 3令。这印证了前面的描述。

    1.3K20

    Metasploit-模块介绍

    ,进行的攻击行为利用发现的安全漏洞或配置弱点对目标系统进行攻击,以植入和运行攻击载荷,从而获取对远程目标系统访问权的代码组件 主动渗透攻击: 所利用的安全漏洞位于网络服务端软件与服务承载的上层应用程序之中...,由于这些服务通常是主机上开启一些监听端口并等待客户端连接,因此针对它们的渗透攻击可以主动发起,通过连接目标系统网络服务,注入一些特殊构造的包含"邪恶"攻击数据的网络请求内容,触发安全漏洞,并使得远程服务进程执行在...MSF框架中可以自由的选择、传送和植入 3 溢出代码(Shellcode) 渗透攻击时作为攻击载荷运行的一组机器指令,shellcode通常用汇编语言编写 4 模块(Module) MSF中,一个模块是...OpenVAS等业界著名的开源网络扫描工具,从而具备全面的信息搜集能力,为渗透攻击实施提供必不可少的精确情报 8 免杀模块(evasion) 对木马或者攻击载荷进行“免杀”操作 9 空指令(nops) 空指令(NOP...)是一些对程序运行状态不会造成任何实质影响的空操作或者无关操作指令,最典型的空指令就是空操作,x86 CPU体系架构平台上的操作码是0x90 10 编辑器模块(encoders) 攻击载荷模块与空指令模块组装完成一个指令序列后

    43640

    C# IL DASM 使用

    命令:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe (window 7 64位 操作系统安装目录) 。 ?...MANIFEST:是一个附加信息列表,主要包含程序的一些属性,如程序名称、版本号、哈希算法等; Democode:项目名称 Democodeing.Common:命名空间 Democodeing.ICar...并且它继承自程序—mscorlib的System.Object类; 2)private,表示访问权限; 3)auto,表示程序的内存加载全部由CLR来控制; 4)ansi,是为了没有托管代码与托管代码之间实现无缝转换...这里主要C、C++代码等; 5)beforefieldinit,是用来标记运行库(CLR)可以静态字段方法生成后的任意时刻,来加载构造器(构造函数); .ctor 方法代码: .method public...,是首先从.entrypoint开始的,即从Main方法作为程序的入口函数; 3)nop:为空该指令,主要给外部设备或者指令间隙准备时间; 4)ldstr:创建String对象变量"Hello World

    1K31

    IL DASM反编译工具使用c# https:www.cnblogs.comcaokai520p4921706.html

    (2)命令:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe (window 7 64位 操作系统安装目录) 。...MANIFEST:是一个附加信息列表,主要包含程序的一些属性,如程序名称、版本号、哈希算法等; Democode:项目名称 Democodeing.Common:命名空间 Democodeing.ICar...并且它继承自程序—mscorlib的System.Object类; 2)private,表示访问权限; 3)auto,表示程序的内存加载全部由CLR来控制; 4)ansi,是为了没有托管代码与托管代码之间实现无缝转换...这里主要C、C++代码等; 5)beforefieldinit,是用来标记运行库(CLR)可以静态字段方法生成后的任意时刻,来加载构造器(构造函数); .ctor 方法代码: .method public...,是首先从.entrypoint开始的,即从Main方法作为程序的入口函数; 3)nop:为空该指令,主要给外部设备或者指令间隙准备时间; 4)ldstr:创建String对象变量"Hello World

    1.9K31

    可怕!CPU暗藏了这些未公开的指令!

    为什么会有这个问题? 平常我们谈论网络安全问题的时候,大多数时候都是软件层面。谈应用程序的漏洞、后端服务的漏洞、第三方开源组件的漏洞乃至操作系统的漏洞。...这份PDF深度研究了x86架构CPU中隐藏的指令,原报告因为是英文,看起来有些晦涩,这篇文章,我尝试用大家易懂的语言来给大家分享一下这篇非常有意思的干货。...比如我们常见的nop指令的机器码是0x90,就是行为9,列为0的那一格。 但是不知道你发现没有,这张表格中还有些单元格是空的,比如0xF1,那CPU拿到一个为0xF1的指令,会怎么执行呢?...但问题难就难x86架构CPU的指令属于复杂指令CISC,它的指令不是固定长度的。...继续上面这个过程,放三个字节可执行页面: 四个: 当放了四个字节可执行页面之后,事情发生了变化: 指令可以执行了!

    41910

    抓了一下WinRAR广告弹窗过程,这下舒服了!

    首先祭出一个工具spy++,这个工具可以用来查看Windows操作系统上所有程序的窗口信息,通过这个工具可以定位到这个广告窗口: 可以看到这个窗口的类名是RarReminder。...接下来我们去除广告弹窗的思路就来了:定位到Winrar程序中,具体是哪个位置弹出这个窗口,然后将那里的逻辑给去除掉。...(PS:这个工具是通过HOOK来实现对相关API函数的调用监控的) Windows操作系统上,窗口的创建是通过一个叫CreateWindow系列的Win32 API进行的。...接下来请出第三个工具,逆向分析神器IDA来看一看WinRAR.exe这个可执行程序中,偏移0xaa56d的位置,上面那个创建广告窗口的地方。...x86平台上,调用函数是一条call指令,直接把这条call指令对应的16进制CPU机器码换成nop指令对应的0x90就可以了。

    20110

    植物大战僵尸:寻找葵花生产速度

    经过我对具体坐标的分析,本游戏中太阳花与太阳花之间,可能使用了一维结构体来存储的植物与植物之间的属性,每次相加偏移都会遍历到下一个植物的属性上面,也就是说无论太阳花种植到什么位置,只要相加偏移就可以遍历到下一个植物的冷却数据...并通过上方的遍历技巧找到当前第一个植物的动态地址,排查到最后可发现剩余11条结果,此时我们可猜测这个定时器应该在0-10000之间,应该不会大于这个参数,如下图我找到了13D65160这个地址,将该地址锁定为...上图是经过测试后备注的一些细节,我们只需要将图中的0045FA7D处的指令,替换为nop即可实现全图的植物无线吐阳光啦,其C语言修改代码如下,代码中使用了上面封装好的的写内存字节函数。...int main() { int PID = 3612; unsigned char Auto[] = { 0xEB }; unsigned char Suns[] = { 0x90, 0x90..., 0x90, 0x90, 0x90, 0x90 }; BOOL ret = WriteByteSet(PID, 0x0043158F, Auto, 1); BOOL ret1 = WriteByteSet

    32820

    DDCTF 2018 逆向 baby_mips Writeup

    0x00 背景 最近一直研究IoT设备的安全,而在IoT设备上程序很多都是MIPS架构的。...所以对MIPS指令有一定研究,而在DDCTF 2018中刚好有一道逆向题目是MIPS程序,于是尝试做了一下。 0x01 环境搭建 由于我们通常的操作系统指令都是x86的,所以无法跑MIPS程序。...这时候为了方便我们理解,就得来远程调试这个MIPS程序。随后,虚拟机中使用QEMU启动该程序,使用IDA连接虚拟机的gdb服务,然后让程序跑起来。输入完key后,程序会在这里崩溃掉。...都有个特点,就是指令的头两个字节为\xEB\x02,且x86令集中\xEB为跳转指令。 我们把操作码反汇编成汇编代码后发现第一条指令是jmp 0x4,刚好MIPS指令每条指令大小为4字节。...于是做出猜测,是不是程序让我们遇到这个指令就跳转四字节呢?然后我们把以\xEB\x02开头的指令全部替换为nop。 替换好之后,我们再使用IDA载入程序,发现已经没有不能识别的代码段了。

    1.6K50

    转载:x86的cpu_relax解析

    x86的内核中一般是调用cpu_relax()。这个函数又是何方神圣呢? 实际上,这个函数很简单。...而我很蛋痛地在想,为什么是rep;nop而不是nop;nop而不是nop;nop;nop…;nop,反正都是什么都不做嘛,为什么偏偏要选这个?...那么为什么不直接写pause而要写rep;nop呢?理论上是等价的,但是实际上为什么不这样做,不好意思,不清楚。...但是可以确定是的pause是Pentium 4才引入的,也许大家比较怀旧所以还用rep;nop也说不定。 So,以后写应用程序而又蛋痛写了循环等待的话,不妨也用用pause吧。...不过我想会在应用程序中写循环等待这么傻的代码的程序员,应该也想不到用pause去节能减排兼提速了吧,伤脑筋。

    2.1K20

    缓冲区溢出漏洞

    至于这个jmp esp的地址原始程序所生成的汇编代码中有大量这样的代码,通过暴力搜索很容易得到,覆盖之后,函数返回之前的时候堆栈的环境大致如下 ?...,传入了一个超长的字符串,其中shellcode是一个开启command part对应的机器码,主函数中我们首先定义了一个非法的字符串,然后将字符串的弟16个字符赋值为shellcode的首地址,为什么这里是...堆栈协同攻击 使用栈溢出攻击的时候经常会破坏原始的堆栈,这样执行完成攻击代码后如果不结束程序,一般程序都会崩溃,堆栈协同攻击是将攻击代码写入到堆中,对于栈来说只覆盖ret位置的地址,让其指向一个特定的地址...通过缓冲区溢出的方式将栈中保存的eip的值修改为0x0c0c0c0c,然后堆中分配200M的内存,将这200M分为200分,每份1M,都填充为、\0x90\0x90\0x90…….\0x90 + shellcode...为什么需要给填充那么多90也就是Nop指令?

    2.1K20

    安全视角下的木马免杀技术讨论

    所以我们需要将主要的攻击代码单独的编译并静态的存储在数据段中,代码块中只保留一些人畜无害的代码,然后程序执行的时候申一处可执行的内存,再将这块攻击代码拷贝到申请的内存中执行,这样才能够尽量降低被查杀的概率...这里我们生成的是一串 16 进制的字节数组,我们可以将它加入到我们的 vs 项目中,程序运行的时候进行动态加载即可执行 shellcode 。...但是,将 loadLibrary 函数作为查杀的依旧,这未免也太野蛮了, 不过,如果要解的话,或许可以用下 virtualprotect 函数,直接修改数据段的可执行属性,然后程序执行的时候直接跳转到这个内存地址上去执行...为什么我的 shellcode 加密了还是会被查杀呢? 我们来看下编译后的 shellcode pe 文件中是什么样子的。...API 调用序列中的,所以,很多学术论文中会以程序的 API 调用序列作为主要的行为特征训练,通过不断优化算法,相信这种通过海量数据训练而获得的病毒查杀能力的技术应该会是之后杀毒引擎的主要方向。

    1.3K10

    SEED:缓冲区溢出漏洞实验

    实验参考资料和实验环境下载:https://seedsecuritylabs.org/Labs_16.04/Software/Buffer_Overflow/ 一、 实验介绍 缓冲区溢出是程序试图写入超出预分配范围的数据的条件固定长度的缓冲区的漏洞...确定str在内存中的位置=ebp-0x211,main函数任一位置加断点,查看ebp的信息 ? ?...(注意:如果buffer数组大小变化,那么它到ebp的相对位置也会和变化,本例中是36,这时需要重新计算return地址的相对位置) 6.攻击程序 通过上述分析,构造恶意代码和对应的地址写入badfile...void main(int argc, char **argv){ char buffer[517]; FILE *badfile; /* Initialize buffer with 0x90...(NOP instruction) */ memset(&buffer, 0x90, 517); /* You need to fill the buffer with appropriate

    1.4K21

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

    缓冲区溢出漏洞实验 缓冲区溢出 缓冲区溢出是程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。...而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到...shellcode介绍 shellcode实质是溢出后执行的能开启系统shell的代码。...3、填充物,填充未使用的缓冲区,用于控制溢出地址的位置,一般使用nop指令填充——0x90表示。 4、结束符号0,对于符号串shellcode需要用0结尾,避免溢出时字符串异常。...(NOP instruction) */ memset(&buffer, 0x90, 517); /* You need to fill the buffer with appropriate contents

    1.2K30
    领券