PE文件解析——PE头解析
PE第二课——PE头解析
课堂笔记PE 头我们能在 010 editor 打开exe后面可以很明显的看到有一个 PE
这就是 PE 头所在的位置。上节课我们也提到了一个 MS-DOS头的最后一个字段 e_lfanew 其实就是我们 PE 头所在的位置,就是这个 PE 文件的字节地址。我们可以看到最后是 0x80,而 PE 头也是在 0x80 的地方开始的。
PE头PE 头分为标准 PE 头(必要)和扩展 PE 头(不必要)。
PE 头结构在 visual studio 中的结构体为 _IMAGE_NT_HEADERS。
它的定义为
12345typedef struct _IMAGE_NT_HEADERS { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader;} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
这里的 Signature 就是 5045,也就是我们看到的 PE。
IM ...
关于global_max_fast的利用
关于global max fast的利用技巧。
global_max_fast 的利用现在才知道 global_max_fast 的一个小技巧,我之前一直以为就是在没有 fastbin 的时候能构造 fastbin。但是没想到它能在 libc 中任意写。首先 fastbin 是存在 fastbinY 数组当中,它的长度好像只有 10。
但是我如果把任意的size都视为fastbin的话,那么这就有一个下标越界了。
比如我把 0x40000 的 chunk 当成 fastbin,那么在free 的时候就会有这样的语句出现:
1main_arena->fastbinY[0x4000]=chunkptr
我这个size 如果能改的任意,那么它就能写在 main_arena 之后的任何的地址。并且由于它在 libc 的地址是固定的,所以我要往一个 libc 中的地址写上堆的地址就很容易。
这里就mark一下,以后遇到了来这更一下传送门,目前也没有找到什么好的例题。
祥云杯2022-leak题解
祥云杯做到一道出的还挺好的题目,而且学了较多的利用思路,特此记录。leak.zip
文件分析这一题呢,是一道经典的 2.27 1.6 版本的堆题,实现了增删改的功能,没有查,4,5两个选项目测是摆设,在题目的一开始,把 flag 的内容读到了堆上,delete 操作存在 uaf 漏洞
思路分析这题它主要是没有 IO 函数,所以 IO 结构体一直没有初始化。但是这里小知识点来了:我们只要把 stdout 的 flag 设置为 0xfbad1800,然后再 exit,它就会输出 IO_write_base 到 IO_write_ptr 俩指针中间的内容,并且它是逐字节打印的,只有尝试打印不可读的内存的时候才会崩溃,只要 IO_write_base 往后还有可读内存,它就一定能打印这些信息。
这个知识其实是 IO 里面的,是当时 fmyy 师傅给我的提示,于是我们的思路就是构造合理的 IO 结构体,然后 IO_write_base 改成 堆的地址,flag 和 IO_write_ptr 改成合理的内范围就可以泄露堆上面的内容了,如图所示:
所以我们的思路是要往 IO 这里写一个堆地址 ...
ciscn_2019_c_5 WriteUp
buu刷题记录——ciscn_2019_c_5
文件分析ida 拉进来发现是很经典的堆题,并且 2,3 的改和查都不可用,在增的过程中可以改。
delete中存在很明显的 UAF。data 段上的堆结构体大概是这样的:
1234struct heap{ int size; char *content;}
版本 2.27,我们可以直接 double free。
但是因为保护全开,且地址难泄露,所以我们能利用的点也比较少。在这样的情况下我们只能去打IO泄露 libc 的地址了。首先构造一个 unsorted bin,因为堆块不能直接编辑我们控制另外一个堆块 double free 之后修改这里的地址。这个地址需要自己注意 libc 版本即使差异很小偏移也有可能会变。
打 stdout 的 flag 改为 0xfbad1800,IO_write_base 低字节修改成 0 就可以泄露成功。泄露成功之后直接打 free_hook 就可以 free 一个 /bin/sh 获得shell。
exp123456789101112131 ...
PE文件解析——MS-DOS头解析
PE第一课——MS-DOS头解析
课堂笔记PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)
PE 文件的结构大约是这样的
用 010 随便打开一个 exe 文件,可以看到它的文件结构组成。
被标红高亮的部分就是 MS-DOS 头,他就是防止 PE 文件运行在 MS-DOS 系统下出现问题。
在 visual studio 当中可以去查看 _IMAGE_DOS_HEADER 结构体去查看 MS-DOS 头结构,结构体定义如下:
123456789101112131415161718192021typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic number WORD e_cblp; // ...
《windows系统编程》——内存基础与相关结构
《Windows系统编程》——内存基础与相关结构 笔记
课堂笔记WINAPI学习在这堂课也有点摸清楚一些规律了,WINAPI 中的一些结构体,除了定义结构体本身以外还会定义它的指针类型,一般在该变量类型名前加上前缀 lp(LP)。
GetSystemInfoGetSystemInfo 函数用于获取系统信息,传入参数位 SYSTEM_INFO *,没有返回值,获取的系统信息通过 SYSTEM_INFO 结构体返回,结构体定义如下。
123456789101112131415161718typedef struct _SYSTEM_INFO { union { DWORD dwOemId; // Obsolete field...do not use struct { WORD wProcessorArchitecture; WORD wReserved; } DUMMYSTRUCTNAME; } DUMMYUNIONNA ...
楔子
仅当我对前两年时间的人生总结吧。。。
Linux Signal机制
今天吧,来具体了解一下 Linux 的一个 signal 机制。
问题引入起因在于我向老师抛出一个问题,在 子进程调用 execve 并重定向标准输出为管道时,父进程从管道读取数据时,采用 read 函数去读取,但是会发现一个问题。就是读和写不太能同步,即使程序退出,管道中还残留数据,如果管道中的数据还有,那么我读入不完整,如果没,则继续调用 read 会挂起父进程无法退出,一直想不到有效的办法解决。
请教老师之后,老师推荐我学学 signal 机制,并给我看了一个例程,例程大致简化一下是这样的:
123456789101112131415161718192021222324252627#include<stdio.h>#include<unistd.h>int k;void func(int sig){ k=0;}int main(){ pid_t pid=fork(); if(pid<0){ write(2,"fork error!\n",12); ...
Hook专题6- hook
今天学一学 hook 专题最后一章,也就是 无痕 hook。
学习笔记这个无痕 hook 是相对无痕,而不是没有方法检测。因为前面的五种 hook 方法可以在完整性检查中直接被检测出来,但是无痕 hook 是通过硬断+VEH的方式 hook 的。内存完整性检查能完美 bypass。
硬件断点在之前的 kxbook 中讲过,是通过 DR 寄存器来实现的。
DR寄存器的用途DR0-DR3DR0到DR3被称为“调试地址寄存器”或“地址断点寄存器”,它们非常简单,其中仅包含断点的线性地址。当该地址与指令或数据引用匹配时,将发生中断。调试寄存器DR7可用于对每个断点的条件进行更细粒度的控制。因为寄存器需要填充线性地址,所以即使关闭分页,它们也可以正常工作。在这种情况下,线性地址将与物理地址相同。
由于这些寄存器中只有4个是可用的,因此每个线程最多只能同时具有4个断点。
DR4-DR5DR4和DR5被称为“保留的调试寄存器”。尽管它们的名称中有“保留”字样,但实际上却不总是保留的,仍然可以使用。它们的功能取决于控制寄存器CR4中DE字段的值。在启用此位后,将启用I/O断点,如果尝试 ...
Hook专题5-VEH hook
学一学 hook 专题,今天是 VEH hook。
学习笔记今天学了比较新的一个 hook 的姿势:利用异常处理去hook。
前置芝士SEHSEH 即 结构化异常处理(Structure Exception Handler),是Windows操作系统提供的强大异常处理功能。当程序执行过程中发生异常时,零环会使用KiDispatchException判断是否有内核调试器。如果没有调试器,零环转交给三环的KiDispatchException,开始找是否有异常处理程序(SEH、VEH)。如果已安装,会调用异常处理程序进行处理
异常处理流程:异常产生->调试器->VEH->SEH->TopLevelEH->调试器
SEH有很多缺点(基于线程、基于栈、处理优先级低)等等。
VEH向量化异常处理(Vectored Exception Handler),我们可以用AddVectoredExceptionHandler函数注册自定义的VEH。当捕获到异常时,我们会拿到一个_EXCEPTION_POINTERS类型的参数。而这个参数的成员ContextRecord ...