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

原创 | 某SCADA的远程代码执行漏洞挖掘与利用

前言 近年来网络安全形势日渐严峻,国内外都开始工控安全越来越重视,而工控领域由于常年来安全的忽视,导致暴露出数量惊人的严重安全漏洞,更为严重的是,相当一部分厂商即使在漏洞披露出来后也没有能力去修复...在利用这个漏洞之前,先要分析该二进制程序开启的缓解措施,幸运的是,该二进制文件都关闭所有的漏洞缓解措施了,这就非常方便我们漏洞进行利用。 ?...值得注意的是,由于payload是通过json进行传入的,所以shellcode和跳板指令(jmp esp)的地址字节值不能大于0x7e,否则会被js进行转码(实在找不到合适的jmp esp指令可以寻找合适的...使用一个弹出对话框的payload进行测试,shellcode使用编码进行编码来保证payload能够正常传到二进制程序中处理: msfvenom -a x86 --platform windows...用户需要有安全意识,及时更新工控软件安全补丁,工控厂商也要培养开发者的安全开发能力,并提交漏洞快速进行响应,提出修复和缓解措施。

1.6K10

Windows下SLmail邮件服务器缓冲区溢出理解及实验

可以看到字符串为 39694438 此时利用pattern_create相对的工具pattern_offset查找这串字节相对的位置 ?...一般来说一个payload的字节数在315-450之间,所以只要将0169A128开始的内存地址溢出到我们的payload就可以了 所以我们开始使用msf生成payload,但是要知道,这是在一个程序内存栈中进行...我们知道,在一个程序运行的时候,程序本身首先会被写入到内存中,顺带着它需要的各种DLL以及Drive和Modules,所以我们可以寻找含有JMP ESP这个指令的各种模块并利用他们。...--platform windows -b "\x00\x0a\x0d" -e x86/shika ?...buffer的A*2606是为了达到EIP点,使程序下一步操作跳转到slmc.dll代码中的一个jmp esp。 这样在esp地址下的我们的shellcode便可得到执行。

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

【Android 逆向】函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )

文章目录 一、GOT 表拦截与插桩拦截 二、插桩拦截简介 三、插桩拦截涉及的 ARM 和 x86 中的跳转指令 一、GOT 表拦截与插桩拦截 ---- 函数拦截有 2 种方式 : 使用 GOT 表进行函数拦截...在实际被调用的函数中添加跳转代码实现函数拦截 ; 在 【Android 逆向】函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 ) 博客中分析到 , " 使用 GOT 表进行函数拦截...100% 拦截成功率 ; " 插桩拦截 " 由于需要 修改代码 , 可能会 被反调试工具发现 , 如果是游戏 , 账号估计就凉了 ; 反调试工具 不可能监控所有的函数 , 一个应用的函数个数都是以万进行计算的...架构下的跳转指令 : 下面的二进制数都是十六进制数 ; 32 位指令 ; E9 00 00 00 00 , JMP target ; JMP 是强制跳转指令 , E9 是对应的机器码 ; ARM...架构是 复杂指令 , ARM 架构是 精简指令 , 从上面的机器码可以看出区别 , x86 架构中指令有 1 字节 , ARM 架构中 指令只有 4 字节 ;

1K10

从hook的并发症理解x64指令格式

其根本原因,是这些程序是 rip relative 的指令,类似于 call lea mov 等指令操作的指令有时候是相对于 PC(rip) 的偏移,CPU 执行 func1的 指令 PC 与 执行 func2...rbp),%rcx rip_next = 0x402e65, CPU并不是直接计算出 _ZN19ZoneActRunActCmdReqC1Ev 的地址,而是按照 rip_next + offset 进行编码...,找出要修正的指令,解析格式,找出 offset 进行修正。...REX.R域是用于扩展ModRM字节中的R(Reg)域,ModRM中的Reg域除了Opcode的补充外,是用来定义寄存器的编码,即寄存器值。...如果没有RIP相对寻址,则所有ModR / M模式都会相对于零寻址存储器。 在64位模式下,将ModR / M Disp32(32位位移)编码重新定义为RIP + Disp32,而不是仅位移。

1.5K90

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

我们可以任意将它替换成 jmp $4字节相对偏移 这样,代码指令流就会进入我们自己的HOOK函数里了。...这是一个很有意思的选项,其实编译器提供这个机制也是举手之劳吧,虽然简单,但它确实为程序员HOOK运行中的函数提供了很大的方便。...看了GCC的manual,发现了一个-mhotpatch=x,y的选项,但是在x86平台不能用,还是比较不爽的。...再一个需要注意的是,由于指令buffer是在堆上分配的,在64位系统上,它的位置和函数代码的位置之差会超过4个字节界定的相对偏移,所以就不能用0xe9+4字节相对偏移来jmp了,而要通过64位绝对地址来跳转了...这样就可以任意编写pre/post回调函数了,但是我们也能看出来,通过int方式来hook,效率的影响是不能忽略,特别是对于那些频繁被调用的函数,kprobe更加不可行。

1.1K10

5.2 基于ROP漏洞挖掘与利用

name变量中,最后将其打印出来,很明显代码中并没有用户输入的变量进行长度的限定,而正是因为如此从而导致缓冲区溢出漏洞的产生。...在x64dbg调试器中此类指令的搜索很容易实现,读者可通过Ctrl+B指令调出特征码搜索功能来实现搜索,本例中我们搜索kernelbase.dll模块,并在其中寻找Jmp ESP指令,需要注意的是此类指令的机器码为...上图中我们可以直观的看出,数据包的格式仅仅是send | hello lyshark并没有添加任何的特殊符号,更没有加密传输,接下来就是要验证端是否存在缓冲区溢出了,这里我们需要编写一个模糊测试脚本来目标服务进行测试...上方笔者所演示的就是典型的基于内存的攻击技术,该技术的优势就是几乎很难被发现,100%的利用成功率,内存攻击技术就是利用了软件的安全漏洞,该漏洞的产生表面上是开发人员没有缓冲区进行合理的检测,但其根本原因是...[eax]", "ret"], ["pop eax", "ret"], ["jmp esp", "ret"], ] # 检索内存指令 for

30540

深入理解计算机系统(4.1)------Y86指令集体系结构

首先我们要知道的是Y86指令是不存在的,这是本书的作者受到 IA32指令,也就是“x86”的启发,所假想出来的一种处理器体系结构,与 "x86" 相比,Y86指令的数据类型、指令和寻址方式都要少一些,...定义一个指令集体系结构,会包括定义各种状态元素,指令和它们的编码、一组编程规范和异常处理事件。   ...他们只对寄存器数据进行操作。   jXX:包括7个跳转指令,jmp,jle,jl,je,jne,jge,jg。根据分支指令的类型和条件码的设置来选择分支。   ...pushl和popl:指令实现了地址的入栈和出栈 2、指令编码   指令的一个重要性质就是字节编码必须要有唯一的解释。...4、总结   本篇博客我们简单介绍了Y86的指令集结构,相对而言不难理解。后面将会介绍具体的逻辑设计和硬件控制语言HCL。

1.1K100

5.2 基于ROP漏洞挖掘与利用

name变量中,最后将其打印出来,很明显代码中并没有用户输入的变量进行长度的限定,而正是因为如此从而导致缓冲区溢出漏洞的产生。...在x64dbg调试器中此类指令的搜索很容易实现,读者可通过Ctrl+B指令调出特征码搜索功能来实现搜索,本例中我们搜索kernelbase.dll模块,并在其中寻找Jmp ESP指令,需要注意的是此类指令的机器码为...图片上图中我们可以直观的看出,数据包的格式仅仅是send | hello lyshark并没有添加任何的特殊符号,更没有加密传输,接下来就是要验证端是否存在缓冲区溢出了,这里我们需要编写一个模糊测试脚本来目标服务进行测试...图片上方笔者所演示的就是典型的基于内存的攻击技术,该技术的优势就是几乎很难被发现,100%的利用成功率,内存攻击技术就是利用了软件的安全漏洞,该漏洞的产生表面上是开发人员没有缓冲区进行合理的检测,但其根本原因是...[eax]", "ret"], ["pop eax", "ret"], ["jmp esp", "ret"], ] # 检索内存指令 for item

38030

IA32和X86有什么区别?

5 控制执行流程 无条件分支 : 跳转;调用;中断 跳转 汇编程序不认为跳转是不良的程序设计,程序的性能有影响  jmp location location是要跳转到的内存地址,被声明为代码中的标签...如今,x86通常指32位指令架构的处理器,比如80386。...按照发展历史看,x86应该是指令概念,一般用于个人PC系统如8086,286,386。IA-32是intel首推的32位架构。...x86-64应该只算是x86指令的64位扩展,并不是一种全新的64位架构。 由于amd64和intel64本质上是一样的,叫法也是很多。...IA64则指Itaniums系统cpu,并不是x86架构的,一般都是用于服务器,不是个人桌面产品,价格昂贵。 ARM64/AArch64 ARM是精简指令RISC下的处理器架构。

2K30

ring0下的Inline hook

这是相对普通的hook来说,因为普通的hook只是修改函数的调用地址,而不是在原来的函数体里面做修改。一般来说,普通的hook比较稳定使用。inline hook 更加高级一点,一般也跟难以被发现。...,都需要至少5个硬编码才能实现,所以这里我们找5个硬编码进行填入我们代码的操作,这里注意不能够找全局变量和重定位的地址,否则在进行还原的过程中可能地址已经发生改变导致程序不能够正常运行 mov ebp,...的计算公式还需要计算我们自己定义的函数newNtOpenKey相对于NtOpenFile的偏移量 ULONG jmpAddr = (ULONG)NewNtOpenFile - StartAddr - ChangeAddr...0x10000; // 与0x10000想与后取反 mov cr0, eax; pop eax; ret; } 关闭页保护之后首先将之前的硬编码保存...,再进行覆盖 ShutPageProtect(); RtlCopyMemory(Old_code, (PVOID)(StartAddr + ChangeAddr), 5); RtlCopyMemory(

47210

DDCTF 2018 逆向 baby_mips Writeup

所以对MIPS指令有一定研究,而在DDCTF 2018中刚好有一道逆向题目是MIPS程序,于是尝试做了一下。 0x01 环境搭建 由于我们通常的操作系统指令都是x86的,所以无法跑MIPS程序。...这时候就需要装QEMU来模拟,QEMU通过源码编译较为复杂,我们又没有特殊的需求,所以直接使用ubuntu的APT进行安装即可。 由于MIPS架构有两种——大端MIPS和小端MIPS。...这时候为了方便我们理解,就得来远程调试这个MIPS程序。随后,在虚拟机中使用QEMU启动该程序,使用IDA连接虚拟机的gdb服务,然后让程序跑起来。在输入完key后,程序会在这里崩溃掉。...都有个特点,就是指令的头两个字节为\xEB\x02,且在x86指令集中\xEB为跳转指令。 我们把操作码反汇编成汇编代码后发现第一条指令是jmp 0x4,刚好MIPS指令每条指令大小为4字节。...然后,为了方便我们了解key比对函数的功能,我们可以需要对MIPS进行反编译,目前可以反编译MIPS程序的工具有两个。

1.5K50

PE格式:手工给程序插入ShellCode

PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密...头的偏移为90字节,只需要修改这个标志即可,修改方式 x64:6081 改 2081 相对x86:4081 改 0081 以X86程序为例,修改后如下图所示。...于是乎我打开了微软的网站,查询了一下相关API函数,最终找到了一个CreateThread()函数可以在进程中创建线程,此处贴出微软该函数的定义以及函数参数的解释。...图片接着我们需要使用一条Jmp指令让其跳转到原始位置执行原始代码,这里的原始OEP位置是0040158B我们直接JMP跳转过去就好,修改完成后直接保存文件。...,并对攻击载荷多重编码,先用shikata_ga_nai编码5次,继续20次的alpha_upper编码,再来5次的countdown编码,最后才生成shell.exe的可执行文件[root@localhost

55300

栈上内存溢出漏洞利用之Return Address

以下图为例, 在当前栈帧中,存在一个局部变量cszContent数组存放在栈上,此时cszContent做strcpy之类的操作,不小心超过了32个字节,那么这时候拷贝的内容将会覆盖Return Address...如果cszContent的溢出操作,覆盖了Arguments你的程序就有可能会造成意想不到的行为。...py C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\mona.py jmp -r ESP -m ntdll.dll ---------- Mona...那么如何准确的覆盖Return Address,这个如果有条件可以调试程序得到Return Address相对于cszContent,当然大多数时候都做不到,这个时候其实就是不断尝试的过程了。...最好的方式是,在使用到内存的地方都对大小进行校验,比如读取的内存是否大于目标的内存。另一个就是微软推荐的使用微软安全函数xxxx_s之类的函数,比如strcpy_s, fread_s等。

49820

PE格式:手工给程序插入ShellCode

PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密...头的偏移为90字节,只需要修改这个标志即可,修改方式 x64:6081 改 2081 相对x86:4081 改 0081 以X86程序为例,修改后如下图所示。...于是乎我打开了微软的网站,查询了一下相关API函数,最终找到了一个CreateThread()函数可以在进程中创建线程,此处贴出微软该函数的定义以及函数参数的解释。...接着我们需要使用一条Jmp指令让其跳转到原始位置执行原始代码,这里的原始OEP位置是0040158B我们直接JMP跳转过去就好,修改完成后直接保存文件。...,并对攻击载荷多重编码,先用shikata_ga_nai编码5次,继续20次的alpha_upper编码,再来5次的countdown编码,最后才生成shell.exe的可执行文件 [root@localhost

46120

使用jprobe建设镜面层叠的原则和见解

再一次,他没有编译,就像刚才编译的文件…时又无聊的工作阻碍了我Linux内核的探索进度,直到今天,我依旧编译内核有相当的恐惧,不怕出错,而是怕磁盘空间不够,initrd的组装拆解之类,太繁琐了。...相对绝对跳之类的)以及Intel的INT 3调试模式单步模式本文不再赘述,赘这个字用得好,由于全部这些细节都是累赘,你换个非Intel平台的话,你就知道这些是多么累赘了,只是一辈子不换平台的那些人来讲...假设你在X86平台。...不恋战,由于我的目的不是搞清晰Intel的指令。 只是还是略微有一点想不通。早就開始平坦内存模式了,怎么如今还有人用长跳啊!无论怎么样,换一种方式。 方式2:借助寄存器。...那就是使用kprobe上面的jprobe进行调试,实际上基于kprobe的调试工具非常多,比方SystemTap之类的,可是个人认为。

71120

NES基本原理(二)CPU

有了 Carry Flag,使得可以进行长度超过 8 位的运算。...LDA $12 ;将$0012地址处的值加载到A Relative 相对寻址,只用于分支指令,操作数是一个有符号数,相对于当前 PC 的偏移量。...换为 Y Indexed Indirect X 变址间接寻址,有些复杂,来看任天堂的 NES 文档中给出的图: 先变址后间接,变址部分同 零页 X 变址(有回绕),只不过获得的地址是个间接地址,还要再进行间接寻址...另外 BRK 指令也可以发起一个 IRQ,前面说过就跟 x86 下的 INT 一样的。...title=CPU_unofficial_opcodes https://wusiyu.me/6502-cpu汇编语言指令/ 只是再多说一点,操作码有官方给出的,还有一些非官方的,有一些游戏它是要使用非官方的操作码

41510

radare2逆向笔记

知识准备 逆向软件的时候往往面对的是汇编代码, 所以对于指令要有个大致的认识, 另外对于一些 模式(pattern), 比如函数入口(prologue), 出口(epilogue)和函数调用约定(calling...解法2: 修改程序 当我们能直接接触程序并且有修改权限时, 那么修改该二进制文件也是个快速通关的好办法!...这时候就要介绍radare2中的另一个工具rasm2了: $ rasm2 -a x86 -b 32 -d "0x740e" je 0x10 $ rasm2 -a x86 -b 32 "je 0x10"...接下来我们要把jz改为jmp: $ rasm2 -a x86 -b 32 "jmp 0x10" eb0e 也就是说把74改为eb就行了! 只改一个字节, 怎么操作?...通常我们在遇到实际问题时是会将这些方式结合起来用的, 比如虽然逆向分析了一部分代码, 但某部分算法特别复杂, 那么就会借用Fuzzy的思想, 这部分逻辑进行Symbolic Execution, 以最快的方式解决战斗

60220
领券