pwn 145
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| * ************************************* * Classify: CTFshow --- PWN --- 入门 * Type : Heap_Exploitation * Site : https://ctf.show/ * Hint : Why it can UAF(use after free) ? * ************************************* 演示glibc 的分配机制 glibc 使用首次适应算法选择空闲的堆块 如果有一个空闲堆块且足够大,那么 malloc 将选择它 如果存在 use-after-free 的情况那可以利用这一特性 首先申请两个比较大的 chunk 第一个 a = malloc(0x512) 在: 0x18f5260 第二个 b = malloc(0x256) 在: 0x18f5780 我们可以继续分配它 现在我们把 "AAAAAAAA" 这个字符串写到 a 那里 第一次申请的 0x18f5260 指向 AAAAAAAA 接下来 free 掉第一个... 接下来只要我们申请一块小于 0x512 的 chunk,那就会分配到原本 a 那里: 0x18f5260 第三次 c = malloc(0x500) 在: 0x18f5260 我们这次往里写一串 "CCCCCCCC" 到刚申请的 c 中 第三次申请的 c 0x18f5260 指向 CCCCCCCC 第一次申请的 a 0x18f5260 指向 CCCCCCCC 可以看到,虽然我们刚刚看的是 a 的,但它的内容却是 "CCCCCCCC" sh cat ctfshow_flag ctfshow{3f139a53-9718-4b95-936c-a73c2296849b}
|
pwn146
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| ▄▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄ ██▀▀▀▀█ ▀▀▀██▀▀▀ ██▀▀▀▀▀▀ ██ ██▀ ██ ██ ▄▄█████▄ ██▄████▄ ▄████▄ ██ ██ ██ ██ ███████ ██▄▄▄▄ ▀ ██▀ ██ ██▀ ▀██ ▀█ ██ █▀ ██▄ ██ ██ ▀▀▀▀██▄ ██ ██ ██ ██ ██▄██▄██ ██▄▄▄▄█ ██ ██ █▄▄▄▄▄██ ██ ██ ▀██▄▄██▀ ▀██ ██▀ ▀▀▀▀ ▀▀ ▀▀ ▀▀▀▀▀▀ ▀▀ ▀▀ ▀▀▀▀ ▀▀ ▀▀ * ************************************* * Classify: CTFshow --- PWN --- 入门 * Type : Heap_Exploitation * Site : https://ctf.show/ * Hint : Why it can UAF(use after free) ? * ************************************* 申请0x20大小的内存p1 的地址: 0x13ba010 把p1[1]赋值为Printf函数,然后打印出"Hello CTFshow" Hello CTFshow
free 掉 p1 因为并没有置为null,所以p1[1]仍然是Printf函数,仍然可以输出打印了"Hello CTFshow again" Hello CTFshow again 接下来再去malloc一个p2,会把释放掉的p1给分配出来,可以看到他俩是同一地址的 p2 的地址: 0x13ba010 p1 的地址: 0x13ba010 然后把p2[1]给改成demoflag也就是system函数
Then get the flag && enjoy it !
$sh cat flag ctfshow{5247ed61-a52c-4a9d-8dcd-53b8467a17ec}
|
pwn147
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| ▄▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄ ██▀▀▀▀█ ▀▀▀██▀▀▀ ██▀▀▀▀▀▀ ██ ██▀ ██ ██ ▄▄█████▄ ██▄████▄ ▄████▄ ██ ██ ██ ██ ███████ ██▄▄▄▄ ▀ ██▀ ██ ██▀ ▀██ ▀█ ██ █▀ ██▄ ██ ██ ▀▀▀▀██▄ ██ ██ ██ ██ ██▄██▄██ ██▄▄▄▄█ ██ ██ █▄▄▄▄▄██ ██ ██ ▀██▄▄██▀ ▀██ ██▀ ▀▀▀▀ ▀▀ ▀▀ ▀▀▀▀▀▀ ▀▀ ▀▀ ▀▀▀▀ ▀▀ ▀▀ * ************************************* * Classify: CTFshow --- PWN --- 入门 * Type : Heap_Exploitation * Site : https://ctf.show/ * Hint : Fastbin_dup -- Double free * ************************************* 演示 fastbin 的 double free 首先申请 3 个 chunk 第一个 malloc(8): 0x1b39010 第二个 malloc(8): 0x1b39030 第三个 malloc(8): 0x1b39050 free 掉第一个 当我们再次 free 0x1b39010 的时候, 程序将会崩溃因为 0x1b39010 在 free 链表的第一个位置上 我们先 free 0x1b39030. 现在我们就可以再次 free 0x1b39010 了, 因为他现在不在 free 链表的第一个位置上 现在空闲链表是这样的 [ 0x1b39010, 0x1b39030, 0x1b39010 ]. 如果我们 malloc 三次, 我们会得到两次 0x1b39010 第一次 malloc(8): 0x1b39010 第二次 malloc(8): 0x1b39030 第三次 malloc(8): 0x1b39010 $sh cat flag ctfshow{7dbdfb56-d36a-42a8-a804-0e990d4d61dc}
|
pwn148
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| ▄▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄ ██▀▀▀▀█ ▀▀▀██▀▀▀ ██▀▀▀▀▀▀ ██ ██▀ ██ ██ ▄▄█████▄ ██▄████▄ ▄████▄ ██ ██ ██ ██ ███████ ██▄▄▄▄ ▀ ██▀ ██ ██▀ ▀██ ▀█ ██ █▀ ██▄ ██ ██ ▀▀▀▀██▄ ██ ██ ██ ██ ██▄██▄██ ██▄▄▄▄█ ██ ██ █▄▄▄▄▄██ ██ ██ ▀██▄▄██▀ ▀██ ██▀ ▀▀▀▀ ▀▀ ▀▀ ▀▀▀▀▀▀ ▀▀ ▀▀ ▀▀▀▀ ▀▀ ▀▀ * ************************************* * Classify: CTFshow --- PWN --- 入门 * Type : Heap_Exploitation * Site : https://ctf.show/ * Hint : Fastbin_dup_into_stack -- Double free * ************************************* 通过欺骗 malloc 使得返回一个指向受控位置的指针(本例为栈上) 通过 malloc 申请到 0x7ffe9bec2270. 先申请3 个 chunk chunk a: 0x25dd010 chunk b: 0x25dd030 chunk c: 0x25dd050 free 掉 chunk a 如果还对 0x25dd010 进行 free, 程序会崩溃。因为 0x25dd010 现在是 fastbin 的第一个 先对 b 0x25dd030 进行 free 接下来就可以对 0x25dd010 再次进行 free 了, 现在已经不是它在 fastbin 的第一个了 现在 fastbin 的链表是 [ 0x25dd010, 0x25dd030, 0x25dd010 ] 接下来通过修改 0x25dd010 上的内容来进行攻击. 第一次 malloc(8): 0x25dd010 第二次 malloc(8): 0x25dd030 现在 fastbin 表中只剩 [ 0x25dd010 ] 了 接下来往 0x25dd010 栈上写一个假的 size,这样 malloc 会误以为那里有一个空闲的 chunk,从而申请到栈上去 现在覆盖 0x25dd010 前面的 8 字节,修改 fd 指针指向 stack_var 前面 0x20 的位置 第三次 malloc(8): 0x25dd010, 把栈地址放到 fastbin 链表中 这一次 malloc(8) 就申请到了栈上去: 0x7ffe9bec2270 $sh cat flag ctfshow{f7fdefd4-fab4-4a29-96b0-8ccb6f648dc1}
|
pwn149
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| linkpwn@linkpwn-VMware-Virtual-Platform:~$ nc pwn.challenge.ctf.show 28266 ▄▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄ ██▀▀▀▀█ ▀▀▀██▀▀▀ ██▀▀▀▀▀▀ ██ ██▀ ██ ██ ▄▄█████▄ ██▄████▄ ▄████▄ ██ ██ ██ ██ ███████ ██▄▄▄▄ ▀ ██▀ ██ ██▀ ▀██ ▀█ ██ █▀ ██▄ ██ ██ ▀▀▀▀██▄ ██ ██ ██ ██ ██▄██▄██ ██▄▄▄▄█ ██ ██ █▄▄▄▄▄██ ██ ██ ▀██▄▄██▀ ▀██ ██▀ ▀▀▀▀ ▀▀ ▀▀ ▀▀▀▀▀▀ ▀▀ ▀▀ ▀▀▀▀ ▀▀ ▀▀ * ************************************* * Classify: CTFshow --- PWN --- 入门 * Type : Heap_Exploitation * Site : https://ctf.show/ * Hint : Fastbin_dup_consolidate * ************************************* 申请两个 fastbin 范围内的 chunk: p1=0x197a010 p2=0x197a030 先 free p1 去申请 largebin 大小的 chunk,触发 malloc_consolidate(): p3=0x197a050 因为 malloc_consolidate(), p1 会被放到 unsorted bin 中 这时候 p1 不在 fastbin 链表的头部了,所以可以再次 free p1 造成 double free 现在 fastbin 和 unsortedbin 中都放着 p1 的指针,所以我们可以 malloc 两次都到 p1: 0x197a010 0x197a010 $sh cat flag ctfshow{2f30058c-812f-4649-9b5d-6298c5144bba}
|
写着写着发现一直写这个营养价值太低了,先停下把,以后发现了营养再来写。