[BJDCTF 2020]YDSneedGirlfriend

bamuwe發表於2024-04-23

[BJDCTF 2020]YDSneedGirlfriend

UAF|

所謂UAF漏洞是指程式在執行時透過懸空指標(懸空指標是指仍然指向已被釋放記憶體空間的指標)訪問已經被釋放的記憶體.

bamuwe@bamuwe:~/YDSneedGirlfriend$ ldd girlfriend
        linux-vdso.so.1 (0x00007ffd09fec000)
        /home/bamuwe/pwn_tools/glibc-all-in-one/libs/2.23-0ubuntu3_amd64/libc.so.6 (0x00007f415da00000)
        /home/bamuwe/pwn_tools/glibc-all-in-one/libs/2.23-0ubuntu3_amd64/ld-2.23.so => /lib64/ld-linux-x86-64.so.2 (0x00007f415dfc3000)

image-20240423220900124

int backdoor()
{
  puts("YDS get N+ girlfriend!");
  return system("/bin/sh");
}

backdoor()函式

YDS need a grilfriend!,can u help him?
------------------------
 1. Add a girlfriend
 2. Delete a girlfriend
 3. show her name
 4. give up
------------------------
Your choice :1
Her name size is :10
Her name is :admin
Success !Wow YDS get a girlfriend!
------------------------
 1. Add a girlfriend
 2. Delete a girlfriend
 3. show her name
 4. give up
------------------------
Your choice :1
Her name size is :10
Her name is :bdmin
Success !Wow YDS get a girlfriend!
------------------------
 1. Add a girlfriend
 2. Delete a girlfriend
 3. show her name
 4. give up
------------------------
Your choice :2
Index :0
Success
------------------------
 1. Add a girlfriend
 2. Delete a girlfriend
 3. show her name
 4. give up
------------------------
Your choice :1
Her name size is :10
Her name is :cdmin
Success !Wow YDS get a girlfriend!
------------------------
 1. Add a girlfriend
 2. Delete a girlfriend
 3. show her name
 4. give up
------------------------
Your choice :3
Index :0
cdmin

先是申請了chunk0,chunk1,再delete chunk0,這時候chunk0進入fastbins,但指向chunk0的指標並沒有被清空,仍然指向chunk0的記憶體地址,申請一個和chunk0同樣大小的chunk3,透過fastbin的機制,就會把chunk0的記憶體地址分配給chunk3,此時有兩個指標指向了同一塊記憶體地址,也就是說,根據程式邏輯,既可以透過chunk3的指標向這塊記憶體新增內容,又可以透過chunk0的指標讀取內容,按照以上邏輯,向這塊chunkfd位置寫入backdoor()地址,再讀取,就可以getshell

unsigned __int64 del_girlfriend()
{
  int v1; // [rsp+Ch] [rbp-14h]
  char buf[8]; // [rsp+10h] [rbp-10h] BYREF
  unsigned __int64 v3; // [rsp+18h] [rbp-8h]

  v3 = __readfsqword(0x28u);
  printf("Index :");
  read(0, buf, 4uLL);
  v1 = atoi(buf);
  if ( v1 >= 0 && v1 < count )
  {
    if ( *(&girlfriendlist + v1) )
    {
      free(*(*(&girlfriendlist + v1) + 1));
      free(*(&girlfriendlist + v1));
      puts("Success");
    }
  }
  else
  {
    puts("Out of bound!");
  }
  return __readfsqword(0x28u) ^ v3;
}

沒有清除指標

image-20240423222752483

Fastbin是glibc堆管理中的一種技術,用於加速小塊堆記憶體的分配和釋放。它適用於小於等於64位元組的大小的堆塊。

基本原理如下:

  1. 分配階段
    • 當程式請求小塊記憶體時,glibc會先檢查fastbin連結串列中是否存在合適大小的空閒堆塊。
    • 如果存在,則直接將該空閒堆塊分配給程式,並將連結串列中的對應節點移除。
    • 如果不存在,則將該請求大小的堆塊從堆中分配出去。
  2. 釋放階段
    • 當程式釋放小塊記憶體時,glibc會將該堆塊放入fastbin連結串列中,而不是立即釋放到作業系統。
    • 如果釋放的堆塊大小與fastbin連結串列中的某個大小匹配,則將該堆塊放入對應的fastbin連結串列中。
    • 如果釋放的堆塊大小與fastbin連結串列中的某個大小不匹配,則將該堆塊直接釋放到堆中,而不放入fastbin連結串列。
  3. 使用階段
    • 下次程式再次請求合適大小的記憶體時,glibc會優先從fastbin連結串列中取出空閒堆塊,而不是直接從堆中分配。
    • 如果fastbin連結串列中沒有合適大小的空閒堆塊,則從堆中分配。

Fastbin的使用可以減少頻繁地向作業系統請求記憶體和釋放記憶體的開銷,提高記憶體分配和釋放的效率。然而,由於fastbin連結串列中的堆塊並沒有被完全清空,因此也存在一定的安全風險,可能導致堆溢位等漏洞。因此,在編寫安全性要求高的程式時,需要謹慎使用fastbin機制。

相關文章