自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(72)
  • 资源 (1)
  • 收藏
  • 关注

原创 常见堆攻击手段

fastbin利用smallbin利用unsortedbin利用largebin利用

2019-10-10 09:20:07 1518 1

原创 软件设计模式-模板模式-迭代器模式

模板模式(Template Model)当某些事物有着相似的算法流程的时候 我们就可以使用模板模式优化冗余代码例如咖啡和茶的烹饪 他们的算法流程是基本一致 变的只不过是一些配料示例代码如下import java.util.Scanner;/** * @Title: TemplateModelTest.java * @Package * @Description: TODO...

2019-12-11 21:12:49 385

原创 软件设计模式-适配器模式-外观模式

导语适配器模式和外观模式他们很容易让人混淆他们真正的用法适配器模式的使用场景是需要转换一个或多个接口到我们的目标类中 **外观模式则是简化复杂接口的一个使用 其主要作用不是用来转换接口的 而是一个简化的主要作用**适配器模式日常生活中我们为了让各种不同样式的插头都能和插座兼容 那么我们就需要适配器这个组件 同样 在设计模式中 我们也有适配器模式这样一种概念适配器模式的最主要的作用就是对...

2019-12-11 12:43:49 396

原创 软件设计模式-单例模式-命令模式

单例模式(singleton model)单例模式可以保证所实例化的对象只有一个例如在Windows中 我们希望在不同时刻打开的注册表 我们从操作系统获得的注册表应该是一致的 所以这就必须程序保证仅且仅一次实例化注册表对象实现单例的方式主要有三种常规单例模式实现常见的实现单例模式(这种 不具有多线程安全)这种实现单例的做法是对我们想要实现单例的类私有化其构造方法 ** 然后在单例类中单...

2019-12-10 15:58:29 342

原创 软件设计模式-装饰器模式-工厂模式

装饰器模式之前我们说过软件设计模式的一个典型特征就是 使用面向接口而不是继承的编程 但是有种情况是特殊的 例如我们的装饰器模式 之所以需要装饰器模式 是因为需要运行时对某个类进行修饰 由于我们设计模式的准则是开放-关闭原则 即扩展性要较高 并且关闭修改 即我们肯定是不能够修改基类的 还要能增加新的特性 这就是为什么代码中不论是Beverage(饮料)还是Condiment(配料) 都需要一个共同...

2019-12-09 20:20:30 356

原创 软件设计模式-简介-策略模式-观察者模式

核心思想软件设计模式的一个最核心,最基础的思想是将会变化的部分取出来并进行封装 这样的话以后需要扩充 或需要进行改变的时候就很方便了, 而不至于影响到不需要变化的那部分。第二个原则是我们针对的是面向接口编程 即我们不要针对具体的实现 就像造汽车 我们需要的是生产组件 组装的组合有千万种 但是组件是一定的! 所以我们是面向接口编程例如经典的鸭子叫 针对飞和叫两种行为 进行编程!通过使用...

2019-12-08 20:38:49 240

转载 a 标签的四种伪类 (:link, :visited, :hover, :active) 同时出现时的顺序问题

a 标签的四种伪类 (:link , :visited, :hover, :active) 的顺序如下 (1) :link 选择所有未访问链接 (2) :visited 选择所有访问过的链接 (3) :hover 选择鼠标在链接上面的链接 ( :hover 选择器器可用于所...

2019-11-22 20:13:53 3266 1

原创 360安全杯初赛 re题解

先静态搜索一波字符串 发现main函数的位置观察输入 检测了长度为32 然后将前16字节进行拷贝 之后调用了一个loc_404600和change_2进行了变换和check 成功通过会输出Congratulations!!! 所以目的很明显 就是逆向这两个函数loc_404600进入发现根本没有栈帧 推测可能是SMC由于在主函数中没有相关还原代码 所以程序可能在别的位置 查看了下T...

2019-10-24 10:03:29 252

原创 glibc2.23-glibc2.29的malloc.c的变化

在pwn堆利用中 往往需要根据glibc的版本对exp进行一个改进本人根据自身的需要对glibc2.23-glibc2.29在malloc.c在堆分配和回收策略上的变化进行一个记录最主要的是记录报错信息Glibc2.23_int_malloc从fastbin中分配fast chunk的时候malloc的时候 会对fastbin->fd指向的chunk 验证一遍它是否在对应的fas...

2019-10-17 09:26:18 1490

原创 glibc2.26下针对Tcache的利用手段

Tcache机制出现是在glibc版本为2.26的时候 glibc引入tcache的原因是为了更进一步加快chunk的分配 但一方面却在安全性上大打折扣。示例代码取自ctf-all-in-oneTcache Double Free In Glibc2.26#include <stdlib.h>#include <stdio.h>int main() { ...

2019-10-15 20:06:36 414

原创 glibc Tcache机制

Tcache的简述在Glibc的2.26中 新增了Tcache机制 这是ptmalloc2的缓存机制Tcache在glibc中是默认开启的,在Tcache被开启的时候会定义如下东西#if USE_TCACHE/* We want 64 entries. This is an arbitrary limit, which tunables can reduce. */# define ...

2019-10-15 19:24:09 3184

原创 堆基础---6 深入理解free()函数

_libc_freefree函数在glibc中的真实名是 _libc_free()。void __libc_free(void *mem) { mstate ar_ptr; mchunkptr p; void (*hook)(void *, const void *) = atomic_forced_read (__free_hook); if (__built...

2019-09-26 21:20:24 1094

原创 堆基础---4 对malloc的总结

malloc的流程分析首先我们要知道_libc_malloc的别名是malloc 所以malloc是从_libc_malloc函数开始的。在一开始会读取一个__malloc_hook的指针 这里一开始进程初始化的时候是填充为malloc_hook_ini所以会hook该_libc_malloc函数 然后会最先调用该hook首先将全局的_malloc_hook填充为null 因为初始化只需要...

2019-09-26 21:16:40 505

原创 堆基础---3 深入malloc的具体实现

heap_info 通过循环链表串接/* A heap is a single contiguous memory region holding (coalesceable) malloc_chunks. It is allocated with mmap() and always starts at an address aligned to HEAP_MAX_SIZE. */...

2019-09-26 21:16:09 469

原创 堆基础----2 开始入微数据结构

有三个极其重要的堆数据结构是用于堆的管理heap_info(Heap Header的存在) 线程即thread arena可能有多个堆,虽然起初每个arena只有一个堆段,但是随着malloc等函数消耗完堆空间后,新的堆会通过mmap到这个arena中,即受这个arena的管辖!!!,此时这就会有个新的堆段,一个堆段有一个heap_info的数据结构!!! main arena只有一个heap...

2019-09-18 09:25:40 438

原创 堆学习---1 宏观观察

动态内存的分配和释放最重要的就是malloc 和 free 这两个函数 一个是用于向操作系统索取动态的内存空间 一个是用于释放之前通过malloc或者relloc函数分配的空间。其内部通过brk,sbrk和mmap实现对内存的索取。举个例子 当malloc(1024)的时候 即我们只需要1024Bytes,但是进程会向操作系统先批发一块大的内存块,又因为是主线程所以称为main arena 它是...

2019-09-18 09:24:30 227

原创 Windows进程与线程---2

进程空间的格局的总结Windows用户进程空间的格局用户进程的最低地址为MM_LOWEST_USER_ADDRESS即0x10000,最高地址为MM_HIGHEST_USER_ADDRESS即0x8000 0000 - 0x10000 - 1为用户空间可访问的最大地址另外有一个特殊地址KI_USER_SHARED_DATA 在系统空间的0xffdf0000处 而用户是可以访问的 为此有...

2019-09-01 22:40:37 331

原创 Windows进程与线程---1

概述相比于Linux中的进程管理,即创建一个线程的同时创建一个进程。而Windows中却不是这样,它是先创建一个进程作为容器,然后创建第一个线程,也就是对于CreateProcess而言,它先调用NtCreateProcess创建进程,然后调用NtCreateThread创建进程的第一个线程。Windows进程的用户空间一些重要的宏如下#define MM_HIGHEST_USER_ADD...

2019-07-02 10:13:12 1051

原创 内存管理----验证试验

由于对内存管理认识较浅 故通过试验重新巩固 并且 验证一下知识我们知道虚拟地址ADDR_TO_PDE(0xc0000000)可以获得本进程页目录表的虚拟地址位置。而MMU是根据cr3寄存器中的值来确定物理位置的,先验证下两者是否完全一致这里的实验地址就是0xc000-0000接着验证下0xc0000000的pte,其虚拟地址应该为(ULONG)ADDR_TO_PTE(0xc0000000)...

2019-06-30 13:50:13 247

原创 对象管理---4

几个常用的内核函数在Windows的内核管理层(Executive),对象管理是个很重要的机制。Windows对象管理中,有些著作喜欢将其称为"子系统",其实也就是内核管理层。下面讲介绍几个常用的内核中对象管理的函数。ObReferenceObjectByHandle这个函数根据Handle,返回一个该Handle对应的对象。 // // Converts to and from a K...

2019-05-28 19:45:50 363

原创 对象管理---3

对象的创建依旧是针对定时器,定时器对象的创建是通过NtCreateTimer来的。构成这个系统调用的三个步骤是通过ObCreateObject创建目标对象对具体对象做相应的本身的初始化通过ObInsertObject将目标对象插入对象目录和句柄表,并返回句柄。凡是创建对象的系统调用,都要提供至少两个输入参数。其中之一就是DesiredAccess,这个参数的含义是创建对象的访问模式...

2019-05-26 20:11:57 467

原创 对象管理---2

IopCreateObjectTypes以I/O子系统为例,其初始化过程中创建了Adapter,Controller,Device,Driver,IoCompletion,File等对象类型。BOOLEANINIT_FUNCTIONNTAPIIopCreateObjectTypes(VOID){ OBJECT_TYPE_INITIALIZER ObjectTypeInitial...

2019-05-24 18:12:04 497

原创 对象管理---1

对象管理对象,即Object。广义的说,对象就是“目标”,行为的受体,所以,任何客观的事物从广义上讲都可以成为对象。在计算机领域,对象是个专有名词。其定义是:一个(一组)数据结构,以及定义在其上的操作,也就是数据结构 +操作,这个跟我们程序设计的思想是一致的,所谓“基于对象的程序设计”和“面向对象的程序设计”的概念都是基于此的。Windows把文件和设备都看做特殊对象。同样,我们将空间分成用户...

2019-05-23 22:49:38 977

原创 Windows内存管理---5

页面异常在为交割而分配一个区间时,区块的类型是MEM_COMMIT,此后这个区间就可以被访问了。但是,所谓“交割”也只是逻辑上的操作,并未落实到实际的物理页面的映射。于是,用户空间的程序在系统调用成功返回后就可能访问这个区间,然而一访问就因缺页异常而发生页面异常,因为此时实际上尚未建立起物理页面的映射。发生页面异常时,内核走过类似于中断的过程,因异常的原因为页面异常而进入页面异常处理程序MmA...

2019-05-22 17:56:26 813

原创 Windows内存管理---3

虚存页面的映射有了对一个虚存空间的管理和对物理页面的分配管理。下一步自然就是建立二者之间的映射了。页面映射,指从虚存页面到物理页面的映射。多个虚存页面可以映射到同一个物理页面上(例如系统那里,SharedUserData就是内核和用户空间的一块虚拟空间映射到了同一物理页面上),但是同一时间内不可能会有多个物理页面对应于同一个空间的同一个虚存页面上。虚存页面顾名思义是“虚”的,必须通过映射落实到...

2019-05-19 19:38:39 458

原创 深入理解Windows内存管理---2

内核对于物理页面的管理物理页面在内核中的表示以及相关域的介绍深入理解Windows内存管理—1 是对虚存地址的区间和区块的管理。这些区块最终得要落实到物理内存才有实际的效用。而物理内存的管理和使用是以页面为单位的,所以物理内存的管理实际上是对物理页面的管理。内核中,物理页面是以数据结构PHYSICAL_PAGE代表的,类型定义如下:typedef struct _PHYSICAL_PA...

2019-05-18 12:14:11 464

原创 深入理解Windows内存管理---1

内存管理简介作为一个合格的操作系统,为不同进程之间及用户和内核之间要提供隔离机制。实现这些基本要求的手段,就是采用基于页面映射的**“虚拟内存”机制,或者说提供“页管理机制”**。硬件上,这是由CPU内部的“存储管理单元”MMU(Memory Manage Unit)支持的。现代的处理器一般都带有MMU。软件上,则是由系统内核中的内存管理模块来实现的。内存管理的解释广义的内存管理,指...

2019-05-17 14:43:24 1081 4

原创 线性地址转换物理地址

当开启页映射时,我们所有的线性地址都是虚拟地址,只是给我们看的,但是真正的物理地址需要经过线性地址一系列的映射才会到真正的物理地址处。一般是通过三级或者四级映射。也就是10-10-12或者2-9-9-12。今天先实验10-10-12。首先我们要知道页表的概念,页表是一个存储索引号的表,每个元素是4B,对于10-10-12而言,第一个10bit用210就可以表示就可以表示全,第二个也是如此,...

2019-05-16 09:36:16 2297

转载 TSS段(转载)

转载自:https://blog.csdn.net/q1007729991/article/details/52650822,讲的非常好,我就稍微写点提醒自己的,大部分都是借鉴的23333(懒…)TSS:Task State Segment一个TSS的结构类似于下图typedef struct TSS { DWORD link; // 保存前一个 TSS 段选择子,使用 call 指...

2019-05-15 21:29:29 859

原创 Windows内核情景分析 内核发起系统调用的过程

从内核中发起系统调用系统调用一般是来自于用户空间,但是系统有时也会在内核进行系统调用。内核中无法直接调用NtReadFile一类的函数。这一方面是因为Windows内核并不导出这些函数另一方面,这些函数调用时是需要系统调用框架/自陷框架,而从内核直接调用显然没有这样一个框架所以这就是为什么在内核中只能通过ZwReadFile一类函数进行系统调用的原因。这里真的是非常的鞭辟入里!!!,让...

2019-05-15 20:30:31 585

原创 Windows内核情景分析 第二章 从用户空间发起系统调用的过程(仅供自赏)

系统调用/系统服务存在的需求从应用程序的角度看,内核的作用在于提供了一组可供应用程序调用的接口。这组调用我们称为“系统调用”。也可以认为系统调用是内核提供的一种服务。所以系统调用也称为系统服务。从程序运行的角度来看:进程是主动的,有活性的,是发出调用请求的一方。而内核是被动的,只是应程序的需求来提供相应的服务。从整个系统的角度看:内核也有活性的一面,只不过从应用程序本身是看不到的,隐形的。诸...

2019-05-15 16:22:49 793

原创 对TLS底层实现的详解

我在之前的博客里并未提及过Tls的底层初始化,现在好好来谈谈。首先我们要知道Tls的初始化是在入口之前。先从一开始的LdrInitializeThunk说起,在调用LdrPEStartup时,其在修复完导入表后,调用了一次LdrpInitializeTlsForProccess,我们看看他是怎样处理的。static NTSTATUSLdrpInitializeTlsForProccess(V...

2019-05-12 22:56:47 2030

原创 LoadDll详解----衔接于上篇的DLL装载

根据我们上次所讲,其大概流程是差不多理清了,但是还有具体的一些细节和一个Tls的大头还没阐述,先把LoadDll的具体细节讲完,这里推荐大家去看毛德操先生的著作《内核情景分析》,这本书对ReactOS(一种也是基于NT的内核,但是不同于Windows,它是完全开源的)的解析入木三分,我读完这个DLL的装载后大有所获,所以强烈推荐这本好书!!!好了,接下来就是我们的正题了先复习下调用流程。Ldr...

2019-05-12 20:32:21 3902

转载 线程本地存储TLS详解

博客的大部分原理转自:https://blog.csdn.net/zhangmiaoping23/article/details/44345341本人自己把觉得自己需要的部分自己进行了综合。TLS(Thread Local Storage)是为了多线程考虑其线程本身需要维持一些状态而设置的一种机制.TLS在概念上并不复杂。常规设计是将所有对TLS的访问都通过TEB中的指针来进行间接访问,TE...

2019-05-12 17:30:49 5142

原创 DLL装载的实现

Dll装载的实现Dll装载主要由LdrInitializeThunk函数实现,具体如下typedef struct _LDR_MODULE { LIST_ENTRY InLoadOrderModuleList;//链表 LIST_ENTRY InMemoryOrderModuleList; LIST_ENTRY InInitializationOrderModuleList; PVOI...

2019-05-11 17:54:17 1345 2

原创 绑定输入

绑定输入和延迟载入,本质上都是为了程序的快速运行而考虑的。绑定导入的结构,每一个绑定输入的DLL都对应于一个IMAGE_BOUND_IMPORT_DESCRIPTOR结构typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR { DWORD TimeDateStamp; WORD OffsetModuleName; ...

2019-05-11 12:11:40 214

原创 利用Ldr获得加载的DLL的基址

利用链如下:fs寄存器 -> TEB -> PEB -> PEB_LDR_DATA -> LIST_ENTRY -> LDR_DATA_TABLE_ENTRY -> BaseOfDllwindbg 用r命令查看fs寄存器的值根据fs段寄存器,我们找到它的GDTR,如下找到了GDT的索引为6对应的值gdt[6] = ffc093df`f000000...

2019-05-10 21:09:15 1420

原创 延迟载入

延迟载入一个DLL是一种混合方式,通过LoadLibrary和GetProcAddress,然后我们可以在程序里直接调用它。延迟加载表本质上跟绑定导入表的目的是一样的,都是为了加快程序加载文件的速度,只不过方法不一样,绑定导入表是事先预测DLL的加载位置,从而减少指令的执行。延迟加载是指在调用某个DLL时才去加载,目的是为了避免在程序启动之初就加载了不必要的DLL而浪费了时间。延迟载入并不是...

2019-05-10 19:39:41 281

原创 重定位表详解

重定位表对于EXE文件是没有必要的,因为EXE程序是第一个被载入内存的模块。而DLL却是必须需要重定位信息的,因为DLL不一定加载到它默认的ImageBase上。重定位表作为一个单独的区块放到区块表中,其名字一般为**.relc**。PE文件通过将所有可能的修改的数值存放到一个数组里,以一种统一的方式进行修正。每个重定位信息以一个IMAGE_BASE_RELOCATION开始,采用类似页分割的...

2019-05-10 17:53:36 3780 2

原创 模拟Loader装载输入函数的RVA地址至FirstThunk

这次模拟了系统在加载程序到内存时,程序的导入表中的FirstThunk被替换的过程。这里只演示了ImportByName的情形,仅供自娱自乐,233333。#include <Windows.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#pragma warning(d...

2019-05-10 16:52:45 259

看雪加密与解密,SEH,及完整的环境

看雪加密与解密的SEH资料,及完整的masm编译环境,具体可参加我的博客,一起来做,具体的环境地址会不同,但是原理都是相同的

2019-05-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除