在这篇文章中,我们将讨论执行流程。像 if/for 或嵌套函数这样的语句是如何被 EVM 在汇编中处理的?
行为分析主要是通过系统监控软件,监控系统中各资源或环境的变化,比如监控注册表、监控文件、监控进程,以及监控网络等。当然了,还可以通过 HIPS 软件来监控病毒的行为。各类系统监控工具或者是 HIPS 软件都是在系统的不同层面上进行了不同方式的 HOOK。比如说在内核层进行 HOOK,在应用层进行 HOOK。HOOK 的方式也是多样化的,比如直接 HOOK API 函数,或者 HOOK SSDT 表中的内核函数。
函数是任何一门高级语言中必须要存在的,使用函数式编程可以让程序可读性更高,充分发挥了模块化设计思想的精髓,今天我将带大家一起来探索函数的实现机理,探索编译器到底是如何对函数这个关键字进行实现的,并使用汇编语言模拟实现函数编程中的参数传递调用规范等。
在之前的文章中,我们实现了一个正向的匿名管道ShellCode后门,为了保证文章的简洁易懂并没有增加针对调用函数的动态定位功能,此类方法在更换系统后则由于地址变化导致我们的后门无法正常使用,接下来将实现通过PEB获取GetProcAddrees函数地址,并根据该函数实现所需其他函数的地址自定位功能,通过枚举内存导出表的方式自动实现定位所需函数的动态地址,从而实现后门的通用性。
这次分析的是一个exe +dll文件,很明显,在exe执行的时候应该要动态链接该dll的,那就一个个分析,逐一攻破。
ShellCode 通常是指一个原始的可执行代码的有效载荷,ShellCode 这个名字来源于攻击者通常会使用这段代码来获得被攻陷系统上的交互 Shell 的访问权限,而现在通常用于描述一段自包含的独立的可执行代码片段。
针对类中特定成员函数的检测其实在工作中也可能用到。C++中可以用SFINAE技巧达到这个目的。
本文利用IDA分析4个简单的恶意程序,旨在基本掌握这4个恶意程序的C语言逻辑结构,同时这4个程序功能逐渐递增,循序渐进。笔者也是初学者,有些不足之处在所难免,请师傅们斧正
在 C++ 语言 的 标准模板库 ( STL , Standard Template Library ) 中 , 提供了 for_each 算法 用于 对一个 STL 容器中的每个元素执行某个指定的 " 操作 " ;
deque 容器中,无论是添加元素还是删除元素,都只能借助 deque 模板类提供的成员函数。表 1 中罗列的是所有和添加或删除容器内元素相关的 deque 模板类中的成员函数。
linux的shellcode就不用说了,直接通过一个int 0x80系统调用,指定想调用的函数的系统调用号(syscall),传入调用函数的参数,即可,懂的都懂。
很多人都问过我这个问题,OpenCV中是怎么绘制与填充多边形的,特别是填充多边形的。因为根据OpenCV中的多边形绘制函数,他们发现这是一个无解的问题。其实我在2017底做一个项目的时候当时会对得到的一个多边形边缘轮廓进行填充,我就发现OpenCV中的多边形绘制函数无法填充,但是其实换个函数就会顺利搞定,只是大家被OpenCV官方的教程误导思维定势,没有想到而已。下面我们就来详细说一下,OpenCV中的多边形绘制与填充问题。
是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。非变异算法具有极为广泛的适用性,基本上可应用与各种容器。
本文稿费80软妹币 砸个广告:各位在网络安全方面有新创作的小伙伴,快将你们的心得砸过来吧~ 文章以word形式发至邮箱: minwei.wang@dbappsecurity.com.cn 有偿投稿,
priority_queue (优先级队列) 是一种容器适配器,它与 queue 共用一个头文件,其底层结构是一个堆,并且默认情况下是一个大根堆,所以它的第一个元素总是它所包含的元素中最大的,并且为了不破坏堆结构,它也不支持迭代器:
通过观察文档我们不难发现,接口相较于之前的 string、vector 和 list 少了很多。它甚至连拷贝构造和析构都没有自己实现,然而这些都得益于容器适配器的使用。
看了一会儿,没看懂这个,绝了。书上写的颠三倒四。文档给每个函数两句话。也是没看懂啊!
注明:swap函数大致处理过程为:把下个地址压入堆栈,然后参数入栈,然后把所有寄存器压入堆栈,分配空间,空间清C然后变量赋值开始程序然后做堆栈平衡清理堆栈
开发环境 VC6.0 编辑器 Cmd Markdown 关于C/C++中基本类型(如:int,int*等)作为函数参数时,是通过将该变量的值压栈来进行参数传递;本文通过C++反汇编代码分析了当对象作为函数参数时(该形参非引用或指针),参数如何传递以及此时栈帧的结构。 对象作为函数参数时,参数传递过程(如:函数的声明为:void show(class Object obj);该函数的调用的为show(arg);其中实参arg的类型为class Object):1,在栈顶上为obj对象分配内存空间,然
因为学习了vector的相关知识,了解了vector大部分接口的底层实现原理,所以我决定自己模拟实现一个mini版的vector类,用来加深对vector各方面知识的理解。 如果有错误或不足之处,还望各位读者小伙伴们指出。
在这个合约中,我们将逆向一个完整的智能合约。这一部分的目标是全面了解智能合约布局,全面了解智能合约的布局,并通过手动的方式对其进行反编译。
queue 队列容器 是 先进先出 ( FIFO , First In First Out ) 容器 ;
栈是计算机科学里最重要的且最基础的数据结构之一。 从技术上讲,栈就是CPU寄存器里面的某个指针所指向的一片内存区域。这里所说的某个指针通常位于x86/x64平台的ESP寄存器/RSP寄存器,以及ARM平台的SP寄存器。 操作栈最常见的指令是PUSH和POP,在 x86 和 ARM Thumb 模式的指令集里都有这两条指令。 PUSH指令会对ESP/RSP/SP寄存器的值进行减法运算,使之减去4(32位)或8(64位),然后将操作数写到上述寄存器里的指针所指向的内存中。 POP指令是PUSH的逆操作:他先从栈指针(Stack Pionter,上面三个寄存器之一)指向的内存中读取数据,用以备用(通常是写到其他寄存器里面),然后再将栈指针的数值加上4或8. 在分配栈的空间之后,栈指针,即Stack Pointer所指向的地址是栈的底部。PUSH将减少栈指针的数值,而POP会增加它的数值。栈的“底”实际上使用的是整个栈的最低地址,即是整个栈的启始内存地址。 ARM的栈分为递增栈和递减栈。递减栈(descending stack)的首地址是栈的最高地址,栈向低地址增长,栈指针的值随栈的增长而减少,如STMFA/LMDFA、STMFD/LDMFD、STMED、LDMEA等指令,都是递增栈的操作指令。
STL内建了一些函数对象:算数仿函数、关系仿函数、逻辑仿函数 用法: 这些仿函数所产生的对象,用法和一般函数完全相同; 使用內建函数对象,需要引入头文件#<include><functional> 一、算数仿函数 #include<iostream> using namespace std; #include <functional> //内建函数对象头文件 //内建函数对象 算术仿函数 //negate 一元仿函数 取反仿函数 void test01() { negate<int>n;
总结: emplace函数在容器中直接构造元素。传递给emplace函数的参数必须与元素类型的构造函数相匹配
函数原型: #include<iostream> using namespace std; #include<functional> #include<vector> #include<algor
(4)boolean empty() 如果队列为空,返回 true ;否则,返回 false
注: 本次讲解使用的是vs2013,不要使用太高级的编译器,越高级的编译器,越不容易学习和观察;同时,在不同的编译器下,函数调用过程中栈帧的创建是略有差异的,具体细节取决于编译器的实现。
数组可以用defineProperty进行监听。但是考虑性能原因,不能数组一百万项每一项都循环监听(那样性能太差了)。所以没有使用Ojbect.defineProperty对数组每一项进行拦截,而是选择劫持数组原型上的个别方法并重写。
维基百科的解释是:把接收多个参数的函数变换成接收一个单一参数(最初函数的第一个参数)的函数,并返回接受剩余的参数而且返回结果的新函数的技术。其由数学家Haskell Brooks Curry提出,并以curry命名。
在我们开始前,这篇文章假定读者具备 solidity 的基础知识,以及了解它是如何部署在以太坊网络的。本文将简要地讨论这部分知识,如果你想对这些知识进行系统复习,请看这篇文章[2]众所周知,solidity 代码在部署到以太坊网络之前需要被编译成字节码。这个字节码对应的是 evm 所解析的一系列操作码指令。本系列文章主要分析编译后的字节码特定部分,并阐明它们的工作原理。在阅读完每篇文章后,你应该对每个组件的功能有一个更清晰的了解。在这一过程中,你会学到很多与 evm 相关的基础概念。我们先来看一个基本的 solidity 合约,以及它部分字节码/操作码,以展示 evm 是如何选择函数的。由 solidity 合约创建的运行态(runtime)字节码是整个合约的内容总结(reoresentation)。在合约中,你可能写有多个函数,一旦部署在链上,就可以被调用。学习 evm 和合约的一个常见问题是,EVM 是如何知道根据合同的哪个函数被调用来执行哪一块字节码?这个问题是我们用来帮助理解 evm 的底层机制以及如何处理这种特殊情况的第一个问题。
优先队列(priority_queue)是一个特殊的队列,它根据元素的优先级进行排序,而不是按照它们被插入的顺序。在C++中,优先队列通常使用堆(heap)数据结构来实现,这使得它能够在==O(
set相关知识点: set:集合,红黑树实现 特点: 1.0 内部的元素根据其值自动排序。 2.0 内部元素只能出现一次。 set数据结构图: set数据结构.PNG set相关函数:
本文将介绍如何将CMD绑定到双向管道上,这是一种常用的黑客反弹技巧,可以让用户在命令行界面下与其他程序进行交互,我们将从创建管道、启动进程、传输数据等方面对这个功能进行详细讲解。此外,本文还将通过使用汇编语言一步步来实现这个可被注入的ShellCode后门,并以此提高代码通用性。最终,我们将通过一个实际的漏洞攻击场景来展示如何利用这个后门实现内存注入攻击。
Author:bakari Date:2012.11.2 1、参数传递问题: < 1 >、堆栈传参 < 2 >、寄存器传参(利用通用寄存器进行函数参数传递的方法) < 3 >、全局变量或静态变量传参 2、 Call Convention(函数调用约定) < 1 >、_cdecl a、 参数从右向左压入堆栈 b、 函数被调用者修改堆栈 c、 在win32应用程序里,宏APIENTRY,WINAPI,都表示_stdcall,非常常见. d、 C和C++程序的缺省调用方式。每一个调用它的函数都包含清空
春节之前我写过一个 Happy New Year 的文章,文章地址如下:用代码送上 Happy New Year,可能这样的代码对于很多程序员来说不多见,但是对于做安全的人来说可能就比较多见了。我来简单的介绍一下,我这段代码是如何实现的。再顺表说一下,前面文章的代码中是有 Bug 的,在这篇文章中会修复这个 Bug。
给大家推荐博主本人学习过的一个c++ STL质量极高的课程链接:https://www.bilibili.com/video/BV1W4411T7wL ,很适合0基础想快速入门C++ STL的朋友
本文都是基于https://samczsun.com/consensys-ctf-2-rop-evm/ 这篇文章进行的分析,如有需要可以参考原文。
这个是对迭代器区间进行的构造函数,思路很简单,把迭代器区间的数据依次尾插就可以了(这里之所以另外使用一个新的模版,而不是使用vector类的模版,是为了兼容更多的数据类型)。这样就可以通过一个现有的类型来构造容器。 但是出乎意料的是出现了一个问题: C2100 非法的间接寻址 (编译层面的问题) 。非法的间接寻址的造成原因有很多:
在我们对etherscan等平台上合约进行安全审查时,常常会遇到没有公布Solidity源代码的合约,只能获取到合约的OPCODE,所以一个智能合约的反编译器对审计无源码的智能合约起到了非常重要的作用。
我们传三个参数进去,可以看到优先级队列模板有三个参数,一个是数据类型,一个是被适配的容器,一个是仿函数,仿函数在下面我们 会讲解,一般第二个参数传入的容器需要满足可以随机访问,例如vector和deque。
昨天有人问我一道题,我有一个栈,我不使用其他数据结构,不使用另一个栈,把这个栈里所有数据反转。
我们上一篇文章学了queue(队列),那优先级队列也是在<queue>里面的:
领取专属 10元无门槛券
手把手带您无忧上云