• linux kernel pwn 内核利用

    NULL Pointer Dereference上古利用方法,仅做记录。 如果内核模块中存在可以被调用的空函数指针,那么调用该空指针函数会执行 0 地址对应的代码。如果此时在内存 0 地址处实现写入 payload 就会执行payload。 首先内核驱动代码如下,其中 my_funptr 是一个空函数指针,且在调用 write 函数时会执行到。 12345678910111213141516...
  • linux kernel pwn 基础知识

    linux 内核概述Linux 内核由 Linus Torvalds 于 1991 年开发,最初的目的是为 Intel 80386 处理器编写一个类 UNIX 系统的内核。当前版本的 Linux 内核由全球社区共同开发维护,通过 Git 管理源代码。 内核概述内核(Kernel)是操作系统的核心部分,负责管理硬件资源并提供给用户程序使用。它充当硬件和应用程序之间的桥梁,是操作系统最基础和最关...
  • musl pwn

    调试环境搭建debug musldebug_musl 可以源码调试。运行 setup.sh 将源码及相关动态链接库解压到根目录下 musl 文件夹下,用的时候只需要将对应版本的 libc.so 文件复制到目录下,然后利用 patchelf 运行如下命令修改可执行文件所依赖的 ld 为 libc.so 即可进行源码调试。 1patchelf --set-interpreter ./libc....
  • Chrome V8 Pwn

    背景知识浏览器框架它是⼀个多进程+IPC的程序, 不同的进程管理不同的内容, browser process: 主进程 rander process: 负责控制渲染内容 GPU process: 负责渲染内容 utility process: 标签页进程 plugin process: 插件进程 每个插件, 每个标签页都是单独的进程, 有属于自己的PID JS 引擎各浏览器对应的 js ...
  • linux 堆利用基础知识

    ptmalloc2 是目前 Linux 标准发行版中使用的堆分配器。 内存分配基本思想 堆管理器负责向操作系统申请内存,然后将其返回给用户程序,但是频繁的系统调用会造成大量的开销。为了保持内存管理的高效性,内核一般都会预先分配很大的一块连续的内存,然后让堆管理器通过某种算法管理这块内存。只有当出现了堆空间不足的情况,堆管理器才会再次与操作系统进行交互。 一般来说,用户释放的内存并不是直接返还...
  • linux 堆利用

    debug glibc:对于一些复杂的堆利用,可以先用支持源码调试的 libc 完成利用,然后改偏移打题目提供的 libc 。 Unlink假设正常情况下,每申请一个 chunk 会保存一个指向该 chunk 内存块的指针。在 chunk1 伪造 fake chunk ,需要注意: 为了绕过 12if (__builtin_expect(FD->bk != P || BK->f...
  • linux 格式化字符串利用

    基础知识常见格式化字符串函数 函数 基本介绍 printf 输出到stdout fprintf 输出到指定FILE流 vprintf 根据参数列表格式化输出到stdout vfprintf 根据参数列表格式化输出到FILE流 sprintf 输出到字符串 snprintf 输出指定字节数到字符串 vsprintf 根据参数列表格式化输出到字符串 vsnp...
  • linux 栈溢出

    逻辑漏洞栈溢出往往可以覆盖栈上的其他局部变量造成逻辑漏洞。 ret2text栈溢出覆盖返回地址为后门函数从而获取shell。 ret2shellcode将shellcode写入可执行的内存地址处,然后栈溢出覆盖返回地址到shellcode从而执行shellcode获取shell。测试 shellcode 例题: 32位例题:wdb_2018_3rd_soEasy 64位例题:ciscn_...
  • linux IO_FILE 利用

    FILE 结构IO FILE 定义的各种主要结构关系如下图所示。 各种文件结构采用单链表的形式连接起来,通过 _IO_list_all 访问。 vatble 为函数指针结构体,存放着各种 IO 相关的函数的指针。 初始情况下 _IO_FILE 结构有 _IO_2_1_stderr_ ,_IO_2_1_stdout_,_IO_2_1_stdin_ 三个,通过 _IO_list_all 将...
  • Java 反序列化

    反序列化基础Java 的序列化(Serialization)和反序列化(Deserialization)是将对象的状态转换为字节流并恢复的过程。这个过程使对象可以保存到文件、通过网络传输或保存到数据库中,并在稍后恢复成对象。 序列化(Serialization):将 Java 对象的状态转换为字节流的过程。这使得对象可以保存到文件、发送到其他 JVM 甚至通过网络传输。 反序列化(Dese...
1234