ctf
文章平均质量分 62
永远在深夜里就好了
这个作者很懒,什么都没留下…
展开
-
【CTF】【PWN】【胎教向】ciscn_2019_n_3
拖进IDA反编译。程序有三个功能:创建NOTE,删除NOTE,print NOTE创建NOTE的时候会先malloc一个固定大小为0xC的chunk。然后再malloc一个大小自己设置的chunk。不难发现,第一个申请的chunk起到控制作用,用来存放每一个NOTE都会有的功能。两个chunk之间的关系应该如下图。我们把第一个chunk命名为control,第二个chunk命名为content。controlcontrol块有三个部分,print和free,还有ptr。ptr指向conte原创 2021-10-28 23:29:55 · 196 阅读 · 1 评论 -
【CTF】【PWN】胎教向babyfengshui_33c3_2016题解
跳过checksec,我们直接分析程序。我这里把这些函数命名为add,delete,display,edit。先看add。就是创建两个chunk,一个的地址存放在s里,一个的地址存放在v2里。然后把s存在v2指向的地址里,用一个名为ptr的数组存放v2。可以看出来,我们创建了两个chunk。按顺序命名为chunk1和chunk2.我们把这两个chunk看作是一个user的两部分。显然,chunk1存放了user的内容,chunk2存放了user的内容的地址和user的名字。其中name原创 2021-10-12 19:42:24 · 296 阅读 · 3 评论 -
【CTF】【PWN】orw
这是沙盒机制,就是限制你能使用的syscall。seccomp-tools这个工具能快速地查出你能使用地syscall。我们能使用的常用的构造攻击链的只有open,read,write。但是因为限制了syscall,所以我们不能用特殊的系统调用getshell。有两种方法,一种直接写汇编,一种利用shellcraft构造。下面是汇编:...原创 2021-10-09 11:13:17 · 1351 阅读 · 1 评论 -
【CTF】【PWN】【UAF】【萌新友好向wp】hitcontraining_uaf
这题的反编译有点阴间。这是add函数,add一次会malloc两个chunk。同时要注意,这里的notelist是一个二维数组。notelist[i]表示的其实是notelist[i][0].后面还有一个notelist[i][1]。我们看notelist[i],他被赋值为print_note_content这个地址的函数。notelist[i][1]才是真正存放chunk的content的地方。为什么要把notelist[i]赋值为print_note_content这个地址的函数呢?下面这原创 2021-10-08 00:10:59 · 391 阅读 · 3 评论 -
[CTF]bjdctf_2020_babyrop2
格式化字符串漏洞+金丝雀绕过。出现这种形式的,v2就是canary。查看他在栈里的位置。var_8就是canary。利用格式化字符串漏洞。%6$p表示输出第六个参数。发现我们输入的东西在第六个参数的位置。调试之后发现有一串随机的十六进制数字。这就是canary。由此可见,这个canary在第七个参数的位置。于是我们先用格式话字符串泄露第七个参数位置上的内容,每一次进行栈溢出的时候把泄露出来的值填入即可。代码如下:from pwn import *from LibcSearche原创 2021-10-07 19:40:32 · 424 阅读 · 0 评论 -
【CTF】【PWN】【BJDctf】bjd_2020_babyheap
一道比较简单的堆题。经典列菜单。create , edit, delete 。可以发现edit存在一个堆溢出漏洞,那么利用方法就很明显了。先创建4个chunk。再删除chunk2,然后对chunk1进行edit,利用堆溢出将chunk2的fd填充为一个fake_chunk.再次malloc就会申请回chunk2的位置,由于fd连接了fake_chunk,所以再申请一次会申请会fake_chunk.fake_chunk+0x23的位置是heaparrary。所以,执行如上代码之后,h原创 2021-10-06 23:07:08 · 172 阅读 · 0 评论 -
[DynELF]jarvisoj_level4
这题没给libc,所以用DynELF。记录一下仅供自己使用,以免以后忘了他的用法。from pwn import *from LibcSearcher import *r=remote('node4.buuoj.cn','26626')#r=process('./a')elf=ELF('./a')context.log_level = 'debug'#libc_base = ELF("./libc-2.23.so")#context.terminal = ['tmux','splitw'原创 2021-09-30 21:19:01 · 99 阅读 · 0 评论 -
[堆漏洞][Fastbin attck][0ctf][pwn]看不懂可以顺着网线来打我,极其详细的babyheap_0ctf_2017
一道典型的菜单题,攻击方式是堆溢出。进入main函数查看发现结构如下图:分析allocate函数可以发现这里能通过调用calloc函数,分配一块最大为4096的chunk(通过calloc分配的chunk会被清空内容)分析fill函数fill函数可以对一块内存进行任意大小的填充,为堆溢出提供了条件。我们的攻击链大概是这样的:首先创建5个chunk,idx分别为0,1,2,3,4,大小均为0x10。然后free掉chunk1,于是chunk1被加入到fastbin里。再free掉chunk原创 2021-09-30 00:52:16 · 305 阅读 · 5 评论 -
[栈迁移][BUUCTF][PWN] ciscn_2019_es_2
前置知识:栈迁移概念:当存在栈溢出且可溢出长度不足以容纳 payload 时,可采用栈迁移。一般这种情况下,溢出仅能覆盖 ebp 、 eip 。因为原来的栈空间不足,所以要构建一个新的栈空间放下 payload ,因此称为栈迁移。栈迁移原理:栈执行命令是从esp指向的位置想ebp指向的位置执行。正常情况退栈的操作是:esp指向ebp指向位置,ebp指向ebp里的内容所指向的位置。当遇见leave|ret命令的时候,相当于执行mov esp ebp; pop ebp; ret;作用就是将ebp指向的位置给原创 2021-09-25 20:57:37 · 404 阅读 · 2 评论 -
[BUUCTF]PWN [HarekazeCTF2019]baby_rop2
惯例checksec发现开了,但也没开。打开IDA进行分析main函数很简洁,也没有内套其他函数。有一个很明显的溢出漏洞,可以通过read函数来把♂栈♂填♂满。那么如果我们把ret地址填写成我们想要的函数,就可以对他进行调用。看看本题题目,名副其实了属于是。很明显,我们可以使用printf函数泄露libc基址。printf函数的形式大概像这样:printf(“%s“,Moriarty),其中格式化字符串是第一个参数,放在rdi中,第二个参数放在rsi中。很明显的,我们应该想办法把rdi覆盖成一个.原创 2021-09-25 01:10:00 · 202 阅读 · 0 评论