![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
PWN
文章平均质量分 73
ctf pwn 的学习和做题笔记。
、皮皮鸭
这个作者很懒,什么都没留下…
展开
-
【pwn】2019Byte ctf 复现
1、mulnote看 wp 说加了 ollvm 混淆,不过影响不大,存在 uaf,libc 2.23,double free 梭了。from pwn import *import sysbinary = "./pwn"context.log_level = "debug"context.binary = binarycontext.arch = "amd64"elf = ELF(binary)local = 1if local: p = process(binary)原创 2021-07-07 20:38:18 · 463 阅读 · 2 评论 -
【pwn】0ctf2017_babyheap IO_FILE解法
libc2.24以后加入了对 vtable 的检查,这里采用 IO_str_jumps,fake_files 如下:fake_file += p64(0) + p64(0x61)fake_file += p64(0) + p64(io_list_all - 0x10)fake_file += p64(0) + p64(1)fake_file += p64(0) + p64(bin_sh)fake_file = fake_file.ljust(0xd8 + 0x20, "\x00")fake_fi原创 2021-07-06 20:42:16 · 180 阅读 · 0 评论 -
【pwn】fastbin attack
1、0ctf2017-babyheapfrom pwn import *import sysbinary = "./pwn"context.log_level = "debug"context.binary = binarycontext.arch = "amd64"elf = ELF(binary)local = 1if local: p = process(binary) libc = elf.libc # p = process(binary, env=原创 2021-07-06 17:18:46 · 168 阅读 · 0 评论 -
【pwn】2020GEEKPWN复现
参考师傅的博客,复现一手2020GEEKPWN。1、babypwn思路: 1)fb 泄漏 heap_base,通过堆溢出修改 size,释放进 ub,泄漏 libc 2)然后 ub attack,这里学到 ub attack 并不一定要分配,因为漏洞发生在解链,所以只要在 ub 中发生解链即原创 2021-07-05 19:28:02 · 386 阅读 · 0 评论 -
【pwn】orw
本文分为两部分,一部分是2.27及一下的 setcontext + orw,一部分是 2.29 及以上的 setcontext + orw。利用条件2.27:开了沙箱uaf 等控制 free_hook一、2.27libc 2.27及以下的 setcontext:给各寄存器传参分别由 rdi 来完成,一般的套路是线泄漏 libc 和 heap_base,我们把某一个 chunk 填充为:frame = SigreturnFrame()frame.rsp = libc.sym['__fr原创 2021-06-19 12:16:35 · 1750 阅读 · 0 评论 -
【BUU】n1ctf2018_null
struct malloc_state{ /* Serialize access. */ __libc_lock_define (, mutex); /* Flags (formerly in max_fast). */ int flags; /* Set if the fastbin chunks contain recently inserted free blocks. */ /* Note this is a bool but not all targets su原创 2021-04-12 23:37:23 · 492 阅读 · 0 评论 -
【BUU】vn2020_easyheap
# -*- coding: utf-8 -*-import sysimport osimport binasciifrom pwn import *from ctypes import *context.log_level = 'debug'binary = './vn_pwn_easyTHeap_1'elf = ELF('./vn_pwn_easyTHeap_1')libc = elf.libc# libc = cdll.LoadLibrary("./libc.so.6")cont原创 2021-04-09 22:32:42 · 84 阅读 · 0 评论 -
【攻防世界】bufoverflow_b
其他部分与 bufoverflow_a一样,但是 b 中多了一个检查:这里不能输入空字节,这样的话就不能像 a 中直接布置,这样会破坏掉前面的字段,需要倒着布置。还有一个需要注意的就是,在触发 off by null 时 a 中可以一次性的布置好 pre_size 和 pre_inuse 位,但是在本题中则需要先覆盖 next chunk 的 pre_inuse 位,然后再清理填充的字节,布置 pre_size 位,再触发:# pad = '1'*0x80 + p64(0x270)add(0x88)原创 2021-04-09 21:21:56 · 153 阅读 · 0 评论 -
【攻防世界】bufoverflow_a
1.程序逆向简单的逆向,记一下几个地方:当chunk数大于2时,便使用 calloc 分配并且 free 后会进行填充:关于 mallopt 见这里。漏洞出现在 fill 功能中,存在 off by null。show 输出遇 0 截断。2.漏洞利用&限制条件off by nullchunk size 无限制可以泄漏地址 chunk 只有两个show 遇 ‘\x00’ 截断可以无限次 edit 由于能够正常 malloc原创 2021-04-09 21:13:38 · 259 阅读 · 0 评论 -
【pwn基础】mallopt
/* SVID2/XPG mallopt options */#ifndef M_MXFAST# define M_MXFAST 1 /* maximum request size for "fastbins" */#endif#ifndef M_NLBLKS# define M_NLBLKS 2 /* UNUSED in this malloc */#endif#ifndef M_GRAIN# define M_GRAIN 3 /* UNUSED in this原创 2021-04-09 20:02:45 · 373 阅读 · 0 评论 -
【攻防世界】babyheap
off by null (libc2.23)1.程序逆向程序在 add 的 read 中存在一个 off by null,同时 add 时无 size 限制,可以直接申请进 unsorted bin 的 chunk,个数足够用。可以 show,free 正常2.漏洞利用和 secret of my heart 一样的利用手法,不再赘述。记录一下调试 og 的过程。我们可以先尝试所有 og ,如果没有打通的情况下,利用 realloc 调节栈帧,这里可以断在最后触发时的 malloc 处,然后 s原创 2021-04-05 16:52:55 · 191 阅读 · 0 评论 -
【攻防世界】echo_back
1.程序逆向程序读起来很简单,提供了两个功能,设置姓名和可以一直循环进行 echo_back,在 echo_back 中存在一个格式化字符串漏洞,但是每次最多读取 7 字节:首先想到是写返回地址,但是最多只写 7 字节导致不能输送完整的 rop ,所以这里需要学习一个新的知识点。2.漏洞利用&知识点一个可以循环利用的格式化字符串,但是有字符限制程序通过 scanf 输入先是通过栈上的一些数据来泄漏 libc_base,elf_base,还要泄漏存放 main 的返回地址的栈地址,这原创 2021-04-05 00:28:04 · 372 阅读 · 2 评论 -
【攻防世界】greeting-150
1.程序逆向main 函数非常简单,存在一个只能利用一次的格式化字符串。自定义 getnline 函数:存在一个奇怪的函数,提供了 system,但是没用 /bin/sh :2.前置知识当程序中的漏洞只能利用一次,但是我们需要利用多次时,可以考虑修改 .fini_array,这里引用了参考文章的图:(图源 https://bbs.ichunqiu.com/thread-43624-1-1.html)程序退出后会依次 .fini_array 中的每一个函数指针,那如果把 start 或者原创 2021-03-28 23:39:57 · 1299 阅读 · 8 评论 -
【攻防世界】Recho
1.程序逆向简单,略2.漏洞利用这道题想了半天,没想明白怎么退出循环,所以看了 ha1vk 师傅博客,学习了一波。退出循环主要是利用 pwntools 提供的一个功能:shutdown。这个功能可以关闭流,这样就可以退出循环了。 因为对于有些系统,system 可以用系统调用,但是有些不行,所以这里采用 orw 的方式读取 flag。 shift + f12 可以看到 flag 字符串,所以也可能是提示我们。题目中有了 read,write 可以使用原创 2021-03-28 20:17:38 · 666 阅读 · 2 评论 -
【攻防世界】secret_file
1.程序逆向感觉这题的绝大部分难度在逆向上,可以逆个大概然后动调就ok了。刚一看到有点懵,直接看看让干什么: 最终需要我们满足 v15 和 v17 的值相等。 往前找看看 v15 和 v17 分别是什么。通过在栈中的关系看到,v15 在第一个函数里面进行了赋了一个 hash 值:此后再也没变过。再看 v17:DD0函数做了一个 SHA256,结果应该是存放在了 v16 中,然后把结果的每个字符转原创 2021-03-28 16:41:39 · 457 阅读 · 0 评论 -
【kernel pwn】(肆)再看babydriver
执行 open("/dev/ptmx", O_RDWR | O_NOCTTY) 这样的操作会打开 ptmx 这种 tty 设备,申请一块内核空间,存放 tty_struct 结构体:struct tty_struct { int magic; struct kref kref; struct device *dev; struct tty_driver *driver; const struct tty_operations *ops; // target原创 2021-03-23 17:12:30 · 198 阅读 · 0 评论 -
【kernel pwn】(叁)ret2usr
继续学习 kernel pwn 相关知识,同时记录一些方法。本文以 QWB2018-core 为例1.前置知识ret2usr 利用了在不开 smep 时,用户空间进程不能访问内核空间,但是内核空间空间可以执行用户空间代码的这一特性。这样的话,就可以不用构造 rop 链,直接在内核空间跳到用户空间的 getshell 的代码上执行,这些 getshell 的代码可以自己编写,最终达到在非 root 用户下提权的目的。2.题目分析见 kernel pwn 系列二即可。3.完整exp#include原创 2021-03-19 21:48:15 · 262 阅读 · 0 评论 -
【kernel pwn】(贰)kernel ROP
继续学习 kernel pwn 相关知识,同时记录一些方法。本文以 QWB2018-core 为例1.题前准备解压等一套流程。先看一下 start.sh (修改后):qemu-system-x86_64 \-m 128M \-kernel ./bzImage \-initrd ./core.cpio \-append "root=/dev/ram rw console=ttyS0 oops=panic panic=1 quiet kaslr" \-netdev user,id=t0, -原创 2021-03-19 17:17:29 · 377 阅读 · 4 评论 -
【kernel pwn】(壹)初探
1.环境搭建只需要安装一个qemu就好了:sudo apt-get install qemu2.准备工作一般kernel题目会给一些文件,分别是boot.sh,bzImage,rootfs.cpio,分别是启动脚本,内核映像,根文件系统映像。题中所给的 rootfs.cpio 一般先是一个压缩包,需要重命名后解压出真正的文件目录,这里参考 cnitlrt师傅的文章给出一些常用脚本:首先是解包脚本:#!/bin/bashmv $1 $1.gzunar $1.gzmv $1 coremv原创 2021-03-18 16:41:27 · 503 阅读 · 0 评论 -
【pwn challenge】2019hw_flower
程序整个程序逻辑很简单。add 功能中只能申请 < 0x58 大小的 chunk:my_read 函数中,当 size 为 0x58 时存在 off by null:remove 功能正常show 函数:可以正常泄漏 libc 等。利用限制和条件chunk size < 0x58,最多申请 6 个off by null有通过 scanf 接收输入可以 show利用思路由于 size 很小,直接 off by null 会把 size 全踩没,想不到怎么处理,在原创 2021-03-12 21:58:01 · 249 阅读 · 0 评论 -
【tw】Bookwriter
程序&初步分析程序会先向 bss 段中读取 0x40 字节的 author 信息:存放 chunk ptr 和 size 的列表在其正下方:看 add 功能中:chunk_list 只有可以存放 8 个指针大小的内存,而 add 中 if 的判断条件显然可以多申请一个 chunk,而 size_list 紧随其后,可以溢出到此处。然后就是正常的读入数据。view 功能正常,可以利用其泄漏 libc。edit 功能存在一处漏洞:这里首先通过先前存放的 size 进行读入数据,然原创 2021-03-08 14:52:57 · 436 阅读 · 3 评论 -
【pwn challenge】0ctf_2018_heapstorm2
程序很早以前就想把这题做了,但是感觉特别麻烦就一直拖着了,今日参考了一位师傅然后解决。程序先是禁用了 fastbin,让你和 mmap 了一段内存,并往该内存中读取了一串随机数,然后进行一个简单的赋值,接着通过一个 for 循环将接下来用到的存放 ptr 和 size 的地方进行了异或操作:最终是如下效果:然后是添加堆块功能:利用 calloc 分配,会清空原堆块的内容,这就需要 overlap 的时候对其中的 chunk header 等进行恢复。update 功能中存在 off b原创 2021-03-02 23:22:39 · 402 阅读 · 1 评论 -
【tw】heap_paradise
程序程序流程很简单,最多16次 add 的机会,size < 0x78,add 时读入数据。delete 时很明显的一个 free 指针未置空。利用条件和限制libc 2.23add 次数有限制,size <= 0x78,不能直接构造 unsorted binfree 指针未置空利用思路因为堆布局半天没想出来,所以参考了一波 ~ 甚是巧妙我最开始想到的是因为不能直接构造进入 unsorted bin 的 chunk,所以首先在堆块内布置好 fake size 和 fa原创 2021-03-01 16:01:41 · 221 阅读 · 0 评论 -
【笔记】pwn模板
今天在一个师傅博客中学到了一种当本地 libc 和远程 libc 不一样,调试和 getshell 之间需要切换的情况下,这种模板就会很简单。拿过来结合自己之前用的如下:from pwn import *import syscontext.log_level = "debug"elf = ELF("./pwn")if sys.argv[1] == "process": p = process("./pwn") libc = ELF("/lib/x86_64-linux-gnu/li原创 2021-02-21 18:57:56 · 504 阅读 · 0 评论 -
【tw】secret garden
程序和思路delete 功能只 free 了 name 的堆块,并且 free 的 if 并没有检查 *v1,所以可以 double free:add 的时候 name 的大小也无限制。所以可以直接 free 进 unsorted bin 然后 申请出来泄漏 libc,接着 double free 打 malloc_hook ,但是 one_gadget 条件不满足所以通过触发 malloc_printerr 来触发。完整exp#encoding=utf-8from pwn import *原创 2021-02-21 18:50:30 · 132 阅读 · 0 评论 -
【tw】secret of my heart(2)
本题另一个思路。程序程序已经分析过一次了。见链接思路这是在看雪上学到的一个思路。参考链接这是另一种稍微简单一点的构造堆重叠的方法。1.首先布置一下堆块,完成堆块合并,这里比较简单:add(0xf8,'123','/bin/sh\x00') #0add(0x68,'123','/bin/sh\x00') #1add(0xf8,'123','/bin/sh\x00') #2add(0x68,'123','/bin/sh\x00') #3add(0x68,'123','123') #4原创 2021-02-21 18:39:26 · 188 阅读 · 0 评论 -
【tw】applestore
程序这道题学到很多东西,针不戳!程序刚拿到手看起来很乱,需要静下心来分析。首先看 add 功能:对应每一个机型都会先 create 在堆中开辟一块空间存放相应信息:先存了指向 iPhone 机名的字符串的地址,v3[1] 存放了这个机型的价格,v3[2] 和 v3[3] 暂时不知道是干什么的先留着。然后还会进行一个 insert 操作 :这乍一看也有点懵,大概是遍历以 myCart 为头节点的链表 ,当第一次 add 的时候 myCart[2] 即为存放第一个 iPhone 信息的堆块地原创 2021-02-18 15:36:56 · 208 阅读 · 0 评论 -
【tw】Tcache_tear
程序add 功能:这里面调用了 my_read() 函数:在 add 中 size 是一个有符号的整数,但是这个函数接收的参数是一个无符号的整数,当有符号数和无符号数进行比较时都会转成无符号数,所以,当 size < 0x10 时结果为负数,传进这个函数就是一个非常大的数导致溢出。show 功能只能打印 name 处的数据:所以想到看看能不能把 name 处放进堆链表中进入 unsorted bin 泄漏 libc。free 功能存在 uaf:name 和存放指针的全局变量 pt原创 2021-02-17 14:59:06 · 262 阅读 · 2 评论 -
【tw】Re-alloc
程序alloc 功能:idx 最大为1,最多两个堆块。然后利用 realloc 来申请,在 bss 段存放堆指针,然后读入数据,有个 off by null 但是好像没什么用。最重要的 realloc 功能:利用 realloc 来对 chunk 进行修改。free 功能没什么问题:利用一 、realloc首先回顾一下 realloc 函数(摘自参考链接),realloc原型是 :extern void *realloc(void *mem_address, unsigned int原创 2021-02-17 14:12:33 · 178 阅读 · 0 评论 -
【glibc2.29】新增保护机制
新增防护机制1、free1.1、tcache通过注释可以看到新增的 key 是为了检测 double free 的。e->key=tcache,这个 tcache 就是:也就是 tcache_perthread_struct 的地址,在调试中也就是这里:即:循环遍历 tcache 链表上所有的 chunk 进行对比,所以 tcache 的 double free 挂了。但是由于 tcache 的特性,他的利用还是要比其他 bins 方便很多。绕过方式:根据上图,只有当key和t原创 2021-02-17 10:55:31 · 537 阅读 · 0 评论 -
【tw】silver_bullet
程序与利用create 函数如下:向 s 中读取字节,这个传进来的 s 在main函数栈帧的如下位置:s + 48 处存放了这段字符的长度。power up 函数如下:这里有一个非常重要的函数 strncat():char *strncat(char *dest, const char *src, size_t n)这个函数是把 src 指向的字符串追加到 dest 字符串的结尾,直到 n 字符长度为止。如果 src 字符串的长度不足 n 则全部追加,如果超过 n 则只追加前 n 个字原创 2021-02-16 18:41:16 · 190 阅读 · 3 评论