自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 内核-分页

每个进程拥有4G的空间是假的 不是真实存在的 当你使用某个空间的时候 操作系统会把你的数据存储到物理内存中物理地址指令Mov eax,dword ptr ds:[0x12345678]其中 0x12345678是有效地址Ds.base+0x12345678是线性地址通常情况下 有效地址 == 线性地址 因为ds.base是0当cpu执行如上指令的时候 会把线性地址转换成物理地址32位cpu 10 10 12 分页从2 9 9 12 转换成10 10...

2022-03-06 16:51:54 309

原创 内核-分段

当我们用汇编读写某一个地址的时候:Mov dword ptr ds:[0x123456],eax真正写的地址是 ds.base+0x123456ES CS SS DS FS GS LATR TR 8个Base Limit atrribute select段寄存器只能看到16位,如何证明又96位???这个代码是没有任何问题的 ...

2022-03-06 16:44:59 525

原创 内核-句柄表

私有句柄表属于一个程序独有的 每个程序都有属于自己程序的句柄表 里面存储了所有本程序打开的内核对象内核对象进程创建 或打开内核对象的时候 将获得句柄,通过句柄访问内核对象为什么需要句柄???句柄存在的目的是为了避免在应用层直接修改内核对象 应用层要是可以修改 如果修改成无效的地址在传送到0环 操作系统就会崩溃 所以操作系统并没有像用户层公开这个结构体 而是创建了一个句柄表每个进程都有自己的这样的私有的表 这个表存储在0环 而你的进程里创建几个句柄 表中就用几项 而句柄则.

2022-03-06 16:33:00 1004

原创 bypass 随机基址

//有漏洞 并且开启了随机基址的程序 溢出点VerifyPassword返回地址#include<windows.h>#include<tchar.h>#include <iostream>#define PASSWORD "1234"void* VerifyPassword(byte* pRet, void* pszPassword, int nSize) { char szBuffer[50] = { 0 }; *pRet = strcmp.

2022-02-18 19:32:23 228

原创 BypassDEP(数据执行保护)

介绍DEP的主要作用是阻止数据页(默认的堆,栈以及内存池页)执行代码。用来弥补计算机对数据和代码混淆这一天然缺陷的。DEP 的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入 shellcode 时,程序会尝试在数据页面上执行指令,此时 CPU 就会抛出异常,而不是去执行恶意指令。Vs设置DEP在使用VS编译的时候也有DEP选项。(VS2019示例)默认情况下是开启的。通过右键单击项目属性–>链接器–>高级–>DEP保护。目标程序//******

2022-02-17 16:41:05 975

原创 BypassGS(安全检查)

异常程序//******有漏洞的程序*************//漏洞函数VerifyPassword 由于文件大小是可变的 但是szBuffer大小只有50 当文件大小大于50的//时候就会产生缓冲区溢出的异常 我们就可以利用这个异常溢出到函数返回地址 达到执行我们代码的目的#include<windows.h>#include<tchar.h>#include <iostream>#define PASSWORD "1234"void* Veri

2022-02-16 20:29:11 615 1

原创 缓冲区溢出漏洞利用--调用白板Messagebox函数两次

//******有漏洞的程序*************//漏洞函数VerifyPassword 由于文件大小是可变的 但是szBuffer大小只有50 当文件大小大于50的//时候就会产生缓冲区溢出的异常 我们就可以利用这个异常溢出到函数返回地址 达到执行我们代码的目的#include<windows.h>#define PASSWORD "15PB"void* VerifyPassword(byte* pRet, void* pszPassword, int nSize) {...

2022-02-14 15:32:42 135

原创 脱壳--03.exe OD脚本脱壳

和02程序类似 但是我们换一种方式脱壳 就是利用OD脚本脱壳我们通过02程序知道壳代码在获取真正的api地址以后 会对api地址做一些处理 然后在填写到iat表中 在我们调用api的时候 并没有直接调用到api 而是加密后的api的代码脚本的框架:只需要知道三个地址 获取真正api的地址 填写iat的地址和oep的地址得到获取真正api的地址把api地址存放在一个临时变量里 中间不管他怎么加密 到填写IAT表的时候 都会填写我们事先保存的临时变量里的api的地址我们现在只要调试出这三

2022-02-08 19:03:59 1267

原创 脱壳--02.exe

程序开始 使用OD打开程序 发现无法利用esp定律程序直接运行 查找模块间调用 随便找到一个函数的调用 发现是FF15方式调用所以是vs的程序 vs程序大致分成两种 vs20xx (特征函数:GetSystemTimeAsFileTime)和 vc++6.0(特征函数:GetVersion) 通过链接器版本 发现是vc6.0 直接在GetVersion上下断点重新运行程序 断点断下 返回到调用处vc6.0和易语言的第一个CALL都是GetVers...

2022-02-08 16:06:54 793

原创 脱壳--00.upx.exe

OD打开程序 直接esp定律直接运行程序 发现这个jmp的跳转距离较大 像是跳到oep的样子 让我们跳转一下入口点五个连续的call 下面还都是0第一个函数调用还是GetModuleHandleA函数的的话那就是一个Delphi程序直接DUMP和修复导入表 转存文件到dump的程序脱壳成功 程序成功运行...

2022-02-08 15:07:15 315

原创 脱壳--00.exe

使用OD打开 发现不能使用esp定律了 我们可以通过特征去找到OEP(入口点)直接运行程序 发现是FF15方式调用函数 就可以确定是VS的程序vs程序大致分成两种 vs20xx (特征函数:GetSystemTimeAsFileTime)和 vc++6.0(特征函数:GetVersion) 在这两个函数上下断点直接运行程序 程序断下 发现并不是我们的模块调用的此函数 继续运行直到可返回我们的模块位置返回自己代码的模块调用的函数以后,在向上一层应该就是我们的...

2022-02-08 14:51:27 558

原创 脱壳--00.aspack.exe

OD打开程序 发现可以使用esp定律的方式脱壳程序运行一步 在esp上下断点 然后直接运行程序就会跑到popad的下一句 这是因为壳代码在执行前会保存源程序寄存器的环境 为了能正确运行原程序的功能 就要用pushad保存源程序的寄存器环境 在壳代码执行完毕后要执行源程序代码前就要恢复寄存器环境 所以发现popad也就离源程序的入口点不远了 让我们继续单步单步到retret以后 再结合我们的特征看 有看到有call jmp回车进入call ...

2022-02-08 14:12:17 167

原创 伪装文件病毒分析-流氓软件

此病毒会伪装成一个文件夹的样子,不小心双击的话就会中招,我的虚拟机是win7环境,看文件夹长的也不是太像,但是不小心也会误点上图是隐藏了后缀名 如果打开后缀名的话就会有点明显现在我们双击触发他 看他的行为会在桌面创建几个链接尝试删除 发现被这个程序占用 其实这个程序就是我们的桌面打开PCHunter32查看下进程列表 发现有两个 一般被隐藏的文件在PCHunter32里是蓝色显示的我们定位到进程文件 去掉隐藏的属性在文件夹就可以显示了...

2021-12-28 14:34:47 857

原创 逆向-#define和const的区别

在实际中,使用const定义的栈变量,最终还是一个变量,只是在编译期间对语法进行了检查,发现代码有对const修饰的变量存在直接修改行为则报错. 被const修饰过的栈变量本质上是可以被修改的.我们可以利用指针获取const修饰过的栈变量的地址,强制将const属性修饰去掉,就可以修改对应的数据内容了,如以下代码#include <iostream>int main(){ const int n1 = 5; int* p = (...

2021-12-02 19:03:27 536

原创 逆向-QQ连连看

目录目录1.样本概况1.2分析环境及工具2. 具体分析过程2.1分析思路2.2找到源程序2.2.1 利用火绒剑监视进程2.3分析道具指南针call2.3.1 找数组首地址2.3.1 找存储道具数组2.3.1 找消除call2.4编写辅助程序2.4.1 无限使用道具2.4.2单次消除2.4.3秒杀4. 效果展示4.1 使用道具4.1.1指南针4.1.3障碍4.2 单次消除4....

2021-12-02 16:54:38 764

原创 逆向-扫雷

1.样本概况1.1应用程序信息应用程序名称:扫雷大小: 119808 bytes文件版本:5.1.2600.0 (xpclient.010817-1148)修改时间: 2021年11月29日, 8:34:38MD5: 16A4FD569A3EB5CEBEB3DA99EF1D17E1SHA1: 31A1A89BA067EA95F117754818429D6D8E8E59CFCRC32: 43242150简单功能介绍:鼠标左键点击棋盘,方框会变为数字,通过数字推测周围的.

2021-11-30 11:41:20 504 1

原创 逆向-数据结构

string源码:void test(int n) { // 样本测试,测试初始化string对象的函数 string str1 = "hello"; string str2 = "hello123"; string str3 = "hello123456"; string str4 = "hello123456789"; string str5 = "hello123456789123"; string str6 = "hello123456789123456"; string

2021-11-28 13:11:25 409

原创 PE文件 - 导入表

导入表在数据目录的第2项,下标为1的位置,记录了可执行文件导入了哪些动态库和函数,INT(导入函数名称表)和IAT(导入函数地址表),由于一个可执行文件可能要多个PE文件支持,所以此结构可能有多个,导入表就是一个结构体数组,以一个全零元素为结尾,每一个数组的元素,代表一个PE文件的导入信息导入表格式typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics;

2021-11-11 13:59:45 1255

原创 PE文件-导出表

导出表导出表一般用于DLL文件,DLL导出了什么函数都记录在导出表上,在数据目录的第1项,下标为0导出表结构typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; //保留值 恒定为0 DWORD TimeDateStamp; //和文件头中的地址一样 WORD MajorVersion; //主版本...

2021-11-08 20:33:52 1408

原创 PE文件-扩展头

扩展头解析typedef struct _IMAGE_OPTIONAL_HEADER { // // Standard fields. WORD Magic; //选项头类型,一般为10BH BYTE MajorLinkerVersion; //链接程序的主版本号 可修改 BYTE MinorLinkerVersion; //链接程序的次版本号 可修改 DWORD SizeOfCode; //代码段大小 可以吃内存

2021-11-06 11:38:48 165

原创 PE文件-VA-FOA的转换

虚拟地址,相对虚拟地址,基地址基地址(base):文件被加载到内存中的位置虚拟地址(VA):4GB虚拟空间中任意一个位置相对虚拟地址(RVA):相对于加载基地址的偏移公式:虚拟地址(VA) = 加载基址(IimageBase)+相对虚拟地址(RVA)PE文件会有一个默认的加载地址 可选头的第10个成员ImageBase,当这个位置被其他文件占用,操作系统将会把文件装载到其他位置FOA文件偏移就是文件没有加载到内存前 相对于0位置的偏移,也就是文件的任何一个地址转换.

2021-11-06 11:00:10 276

原创 PE文件-文件头

文件头格式文件头是NT头的第二个成员-格式为typedef struct _IMAGE_FILE_HEADER { WORD Machine; //1.文件运行平台 WORD NumberOfSections; //2.节表的数量 DWORD TimeDateStamp; //3.文件创建时间 DWORD PointerToSymbolTable; //4.符号表偏移 DWORD NumberOfSymbols; //5.

2021-11-06 09:44:10 151

原创 PE文件-NT头

DOS头和NT头之间存储着一些被DOS头使用的数据,包括一些提示字符串等等...但是这块数据的长度不确定,所以DOS头的最后一个成员指向了新PE的位置NT头格式typedef struct _IMAGE_NT_HEADERS { DWORD Signature; //标记 判断是否是PE文件的第二个标志 值为0x4550 PE00 IMAGE_FILE_HEADER FileHeader; // 文件头 IMAGE_OPTIONAL_HEADER32.

2021-11-06 09:19:36 325

原创 PE文件-DOS头

概述PE文件是指某一种格式的文件,可执行文件(.exe),动态链接ku(.dll),驱动文件(.sys)等等....PE文件整体的格式图:DOS头IMAGE_DOS_HEADER头格式 为了兼容DOS程序而设立 中间字段对现在来说没有作用typedef struct _IMAGE_DOS_HEADER { WORD e_magic; //PE的标志 解析是作为是否为PE文件的第一个标志 值为0X5A4D "MZ" .

2021-11-06 08:58:11 389

原创 浮点数 到 IEEE浮点数 的转换

IEEE浮点数浮点数编码转换采用的是IEEE规定的编码标准,float和double的转换方式相同,但是取值范围不同,编码方式有些许区别.IEEE规定的浮点数编码会将一个浮点数转换成二进制数.以科学计数法划分,将浮点数分为3个部分:符号,指数,尾数浮点类型:float转IEEE格式在存储方式上都是遵守IEEE浮点数的规范Float的存储方式Double的存储方式举例说明:8.25转为浮点存储转二进制:8.25 <=> (二进制)1...

2021-10-31 16:30:07 2399

原创 x64c语言程序 内联x64汇编

工程属性中,生成依赖项里面,自定义生成,勾选masm的选项 2.编写源程序,后缀改为.asm3.右键源程序 属性类型改为下图4.程序改为64位5.声明并调用即可

2021-10-28 15:44:03 744

原创 ollylce(OD)窗口和快捷指令

L : log 保存日志信息E :程序的所有模块的信息(加载基址,大小,OEP,路径)M :程序的内存映射视图T :线程信息W :窗口信息H :句柄表C :CPU窗口(反汇编窗口)/ :补丁信息K :调用堆栈B :软件断点列表R :显示参考(数据引用等)... : RUN跟踪S : 源码显示窗口OD快捷方式F2:断点F4: 运行到光标处F7: 单步F8: 步过F9: 运行Ctrl+A :分析代码(函数,参数...)Ctrl+G : 跳转到Ctrl+X : 复制地

2021-10-27 20:01:10 389

原创 线程同步问题

什么是线程同步和互斥???如果你编写的是多线程的程序,那么多个线程的并发执行,可以认为他们是同时执行代码的,但是线程和线程之间并非是毫无关系的,很多时候会有以下的两种关系:a) 线程A的继续执行 要以线程B完成了某一个操作后为前提,这种称为线程同步b) 多个线程不可同时修改一个资源(全局变量 ,数据结构,对象),这种称为线程的互斥为什么需要线程同步和互斥线程同步:// 09_线程同步的问题.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#incl

2021-10-17 15:13:43 343

原创 c/c++ 一级指针,二级指针,指针数组,数组指针,函数指针,指针函数

前言学习c/c++的时候最让我们头疼的就是指针,各种类型的指针,各种概念,让我们看看什么是指针正文指针和内存息息相关 先让我们看看内存这段内存大家都很熟悉 都知道数组名就是这个数组的首地址那我们怎么解读这块内存分两块看这个内存 前边是内存的编号 后边是这个编号里面存的值什么是内存的编号?内存是连续的 一个接着一个 所以我们为了方便找到他们 给他们起了名字也就是这块内存的地址所以指针里面就是存了这些内存的编号 换句话说 指针存储了这块内存的地址 也就是指向了这块..

2021-09-23 18:24:34 292

原创 2021-09-21c++ 继承,虚继承(内存结构)

普通的公有继承class test1{public: test1(int i) :num1(i) {}private: int num1;};class test2 : public test1{public: test2(int i,int j) : test1(i), num2(j) { }private: int num2;};void main(){ test2 t2(1,2);}(test2

2021-09-21 15:42:46 216 3

空空如也

空空如也

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

TA关注的人

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