自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 New-delete

第一步: _ nh_malloc->_ nh_malloc_dbg->_ heap_alloc_dbg->_heap_alloc_base->HeapAlloc。可以看到new和malloc一样,最终都是调用kernel32.dll的HeapAlloc函数;局部变量一般存放在栈中,当用到时放入栈中,不用时栈中的地址处变成垃圾数据,也不需要管理;第二步:_ free_dbg->_free_base->HeapFree。而用malloc在堆中申请的内存在使用完后要调用free函数来释放;第一步:调用析构函数。

2023-04-10 22:29:59 152

原创 c++模版

最快的排序:桶排序查找:顺序查找(没排序);折半查找(已排序)

2023-04-10 21:54:35 134

原创 引用-友元-运算符重载

(1) 运算符重载的某些场合需要使用友元.(2) 两个类要共享数据的时候.

2023-04-10 21:52:48 352

原创 动态绑定/多态

绑定就是将函数调用和地址关联起来观察反汇编class Basepublic:int x;//函数调用printf("传入Base对象:\n");Base b;printf("传入sub对象:\n");Sub sb;getchar();return 0;

2023-04-10 21:52:09 216

原创 继承|虚函数(补充)

当子类重写父类的普通函数时,如果父类指针指向的是子类对象,那么调用该函数时会根据指针的静态类型调用相应的函数。这种情况下,父类指针无法访问子类中重写的函数,而是调用父类的函数。如果需要访问子类中的函数,需要将父类指针转换为子类指针。在上面的代码中,首先创建了一个父类对象b和一个子类对象d,分别调用它们的print()函数,可以看到父类对象调用的是父类函数,而子类对象调用的是子类函数。接着将父类指针b指向子类对象d,再次调用print()函数,此时会调用父类的函数。最后,将父类指针转换为子类指针d。

2023-04-10 21:50:56 65

原创 继承|虚函数(补充)

当子类重写父类的普通函数时,如果父类指针指向的是子类对象,那么调用该函数时会根据指针的静态类型调用相应的函数。这种情况下,父类指针无法访问子类中重写的函数,而是调用父类的函数。如果需要访问子类中的函数,需要将父类指针转换为子类指针。在上面的代码中,首先创建了一个父类对象b和一个子类对象d,分别调用它们的print()函数,可以看到父类对象调用的是父类函数,而子类对象调用的是子类函数。接着将父类指针b指向子类对象d,再次调用print()函数,此时会调用父类的函数。最后,将父类指针转换为子类指针d。

2023-04-10 21:50:14 33

原创 c++虚函数表

1、当类中有虚函数时,会多一个属性,4个字节2、多出的属性是一个地址,指向一张表,里面存储了所有虚函数的地址。

2023-04-10 21:42:51 57

原创 c++权限控制

c语言可以在xxx.h中定义函数,然后在xxx.cpp中实现函数;在需要用到这些函数时,只要用#include引入xxx.h即可,这样就不用将所有代码全部写在一个cpp中;将函数定义与实现分离,代码会有更好的可读性但不是必须的;xxx.h 头文件中int x;int y;int z;xxx.cpp1、xxx.h 只是一个文件,可以是任何的后缀名,如果你愿意,可以叫xxx.exe2、#include 的作用只是把里面的内容复制过来 仅此而已.

2023-04-10 21:40:06 217

原创 this指针

但是,即使是虚函数,如果编译期就能明确知道调用的是哪个函数,编译器就不会通过函数表中的指针来间接调用,而是会直接调用该函数。如果空类大小为0,若我们声明一个这个类的对象数组,那么数组中的每个对象都拥有了相同的地址,这显然是违背标准的。所 以,我们无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成 员函数里,你是可以知道this指针的位置的(可以通过&this获得),也可以直接使用它。当调用一个类的成员函数时,编译器将类的指针作为函数的this 参数传递进去。

2023-04-10 21:36:11 346

原创 #构造函数、析构函数、继承

构造函数可以被继承,但是不能继承构造函数的实现,因为构造函数是用于创建对象的,子类需要自己定义构造函数,以便创建自己的对象。在子类的构造函数中,可以通过调用父类的构造函数来初始化父类的成员变量。如果子类没有显式地调用父类的构造函数,则会默认调用父类的无参构造函数。析构函数也可以被继承,但是同样不能继承析构函数的实现。当一个对象被销毁时,先调用子类的析构函数,然后再调用父类的析构函数。如果父类的析构函数是虚函数,那么在销毁子类对象时,会先调用子类的析构函数,然后再依次调用父类的析构函数。

2023-04-10 21:34:56 678

转载 反调试技术- IsDebuggerPresent原理 与 反反调试

IsDebuggerPresent 这个函数可以用在程序中,检测当前程序是否正在被调试,从而执行退出等行为,达到反调试的作用。

2022-10-29 13:36:57 296

原创 PE-重定位表

按照上述思路,可写代码打印重定位表的信息(不打印具体项,但按照上面公式打印具体项的数量)但这里注意一个问题,就是遍历这个重定位表,是根据这一块的 VirtualAddress 和 SizeOfBlock 结束后,下一块 VirtualAddress 和 SizeOfBlock 是否全0 来判断重定位表是否结束的。1、每个程序都有一个独立的4G内存空间,当你双击一个程序时,操作系统就为你开辟一个虚拟的4g内存空间,然后就开始贴图,将各个PE文件贴到内存空间,当贴完之后,eip指向程序入口点就开始跑了。

2022-10-27 14:56:33 884

原创 PE-导出表

为什么要分成3张表?​ 1、函数导出的个数与函数名的个数未必一样.所以要将函数地址表和函数名称表分开. ​ 2、函数地址表是不是一定大于函数名称表?​ 未必,一个相同的函数地址,可能有多个不同的名字. ​ 3、如何根据函数的名字获取一个函数的地址?正在上传…重新上传取消4、如何根据函数的导出序号获取一个函数的地址?正在上传…重新上传取消为了再巩固一下,这里再举一个真实的例子,根据上面的规则自己走一遍。.dll 导出函数由以下def 文件导出,可见序号为 2 3 5 6EXPORTS。

2022-10-27 14:54:10 235

原创 静态-动态链接库

在学习导入表、导出表之前,由于导入导出表需要用到静态链接库或者库,所以先来学习一下我们学过如果一个功能的代码需要被我们自己反复使用,即复用,那么可以定义成函数现在如果要多人实现代码的复用,比如我写的一段代码要给别人用,不可能直接把代码复制一份发给别人,这样如果很多人要使用,就不方便,所以可以通过下面的两种方式实现:静态链接库动态链接库。

2022-10-27 14:46:47 1723

原创 数据目录表

我们当时解析可选PE头时,有一个字段为DWORD,的值为多少,说明下面的_;这种类型的结构体就有多少个我们编写一个程序,这个程序的PE结构分节,有代码节,数据节等等节,但是不能理解成一个这些节中只有我们写的代码或者定义的变量等,编译器也会替我们往每一个节中加很多重要的内容:比如我们写代码时会使用一写系统提供的函数,那么编译器就需要添加这个函数的相关信息,告诉系统需要去哪里找到这个函数;一个程序不仅可以使用别的函数,也可以提供函数给别人程序或人使用,所以此时编译器会添加此程序中供别人使用的函数相关信息。

2022-10-27 14:44:26 527

原创 新增节-添加代码

8.修改在文件中对齐的大小SizeOfRawData,这个值和内存中对齐前的一样 9.修改在文件中的偏移PointerToRawData,实际就是上一个节的在文件中的偏移PointerToRawData+在文件中对齐后的尺寸SizeOfRawData 10.修改最后一个节 Characteristics ,节的属性,60000020 表示代码节属性。2、如果第一条的空间也不足, 就扩大最后一个节的尺寸,扩大最后一个节不影响其它节。扩大节的步骤: (Ex 新增节的大小)添加节并实现插入shellcode。

2022-10-27 14:22:44 427

原创 代码节空白区添加代码

和上述过程类似,但是直接在ImageBuffer中改我们计算E8和E9后面的值就可以不用再将文件地址转为内存地址了,在哪里添加硬编码,直接取这个地址代到公式中进行计算即可,更方便一些,但是winhex工具目前为止无法实现,虽然可以修改,但是最后没办法保存,因为如果保存,只能保存此时的全部数据,即运行时拉伸过的全部数据到一个新的文件中,但是我们保存到硬盘上,是需要没有拉伸的,即文件对齐的,所以可以改,但是最后没法保存,不信就往下看。它不是C函数库的标准函数,而是一个API,我们可以用C语言调用API函数。

2022-10-27 14:21:43 674 3

原创 节表(40字节)

节表:相当于这本书的目录{");puts("申请失败");if(!n){printf(" 读取数据失败!");}}{{printf("不是有效的MZ标志\n");return;}printf("********************DOC头********************\n");printf("MZ标志:%x\n",pDosHeader->e_magic);

2022-10-27 14:17:27 426

原创 PE头解析-字段说明

Windows平台:PE(Portable Executable)文件结构Linux平台:ELF(Executable and Linking Format)文件结构。

2022-10-27 14:14:14 2074 1

原创 内存分配-文件读写

一、无参数的宏定义的一般形式为:# define 标识符 字符序列C程序->替换(预编译时)->编译->链接->硬编码(0x21)int fun(){}{}​{//....printf("测试信息");}1.只作字符序列的替换工作,不作任何语法的检查 2.如果宏定义不当,错误要到预处理之后的编译阶段才能发现测试验证代码​{}​{}​{//....}​{fun3();return 0;}

2022-10-27 14:09:58 1372

原创 扩大节-合并节

注意:扩大节最好在最后节扩展 不然要修改好多东西一:扩大节1、拉伸到内存2、分配一块新的空间:SizeOfImage+Ex3、将最后一个节的SizeOfRawData 和 VirtualSize改成NN = (SizeOfRawData或者Virtualsize 内存对齐后的值)+Ex4、修改sizeofimage大小。

2022-10-19 17:55:14 173

转载 浅谈脱壳中的附加数据问题(overlay)

这篇文章我们将解决以下问题:1.什么是overlay,怎么找到overlay?2.为什么有些壳虽然有overlay但是却不用特别处理?3.为什么有些壳只用粘贴overlay数据就ok了,而有些壳却要定位指针?4.如何修复文件指针?

2022-10-11 21:12:14 596

原创 PE加载过程 FileBuffer-ImageBuffer

PE加载过程 FileBuffer-ImageBuffer

2022-09-22 22:19:01 597

原创 [GUET-CTF2019]re

查壳,upx加密的利用虚拟机去壳进入程序__int64 __fastcall sub_400E28(__int64 a1, int a2, int a3, int a4, int a5, int a6){ int v6; // edx int v7; // ecx int v8; // er8 int v9; // er9 __int64 result; // rax __int64 v11[5]; // [rsp+0h] [rbp-30h] BYREF..

2022-03-18 15:35:59 500

原创 [HDCTF2019]MFC

打开程序,会显示一个窗口对程序进行查壳,会发现是一个MFC写的VMProtect保护的32位程序。用MFC事件处理函数的工具xspy打开,将放大镜对准分析的字符串会发现这里有个OnMsg:0464 这是一个没有系统库名的,而且数字特殊,所以写一个程序发送一个有关这个数字的消息,用FindWindow函数获取窗口句柄,SendMessage函数发送消息。#include <stdio.h>#include <stdlib.h&gt...

2021-11-21 14:41:05 3017

原创 Bugku-杰瑞的下午茶

先运行测试一下程序,发现还是要求出flag,所以开始分析程序,先查壳,因为用ida分析我并没有像往常一样成功,所以还是用od动调经过刚才运行程序发现,有一串字符,所以首先尝试od搜索字符串定位到那个地方找到了程序开始的地方,从这里开始单步调试输入我们的测试字符串123456789继续向下运行将参数61,62压入栈,但并不知道有什么用,进入下面这个函数看一看有一些操作,但并没有看出来是什么意思跳过这个函数继续分析,数据窗口跟随,发现我们输入的字符串传入了下一...

2021-11-16 20:29:41 519 1

原创 [ACTF新生赛2020]rome

首先还是查壳,无壳的32程序,直接用ida打开int func(){ int result; // eax int v1; // [esp+14h] [ebp-44h] int v2; // [esp+18h] [ebp-40h] int v3; // [esp+1Ch] [ebp-3Ch] int v4; // [esp+20h] [ebp-38h] unsigned __int8 v5; // [esp+24h] [ebp-34h] unsigned _...

2021-11-13 18:54:51 6759

原创 BUUCTF - re - [ACTF新生赛2020]Oruga

下载好后直接用ida就可以打开,找到main函数_int64 __fastcall main(__int64 a1, char **a2, char **a3){ __int64 result; // rax __int64 v4; // [rsp+0h] [rbp-40h] char v5; // [rsp+9h] [rbp-37h] char s2[4]; // [rsp+Ah] [rbp-36h] char s[40]; // [rsp+10h] [rbp-30h...

2021-10-30 17:32:55 317

原创 BUUCTF-网鼎杯2020-青龙组-joker

一.程序分析首先还是将程序进行查壳IDA打开后尝试f5,发现因为堆栈不平衡,无法直接反编译,所以修改一下选项->常规->反汇编勾选堆栈指针,快捷键alt+k,将SP修改为零,如果下面还遇到同理二.伪代码分析int __cdecl main(int argc, const char **argv, const char **envp){ char v4; // [esp+12h] [ebp-96h] char v5; // [esp+4...

2021-10-28 20:27:05 426

原创 BUUCTF-[羊城杯 2020]easyre1

首先下载好文件后查壳,无壳,直接用IDA打开int __cdecl main(int argc, const char **argv, const char **envp){ int v3; // eax int v4; // eax int v5; // eax int result; // eax char Str[48]; // [rsp+20h] [rbp-60h] BYREF char Str1[64]; // [rsp+50h] [rbp-30h] BY...

2021-10-25 21:04:42 510

原创 BUUCTF-[ACTF新生赛2020]easyre

查壳,发现是UPX1加密的,然后用工具把壳给去掉。用IDA打开int __cdecl main(int argc, const char **argv, const char **envp){ char v4; // [esp+12h] [ebp-2Eh] char v5; // [esp+13h] [ebp-2Dh] char v6; // [esp+14h] [ebp-2Ch] char v7; // [esp+15h] [ebp-2Bh] char v8; ...

2021-10-14 19:36:11 3526 1

原创 BUUCTF-findit 1笔记

这是一个安卓逆向。1.首先用APK-KILL打开,.在MainActivity中打开array-data 2 0x54s 0x68s 0x69s 0x73s 0x49s 0x73s 0x54s 0x68s 0x65s 0x46s 0x6cs 0x61s 0x67s ...

2021-09-30 22:00:27 487

空空如也

空空如也

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

TA关注的人

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