[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)
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
的指標讀取內容,按照以上邏輯,向這塊chunk
的fd
位置寫入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;
}
沒有清除指標
Fastbin是glibc堆管理中的一種技術,用於加速小塊堆記憶體的分配和釋放。它適用於小於等於64位元組的大小的堆塊。
基本原理如下:
- 分配階段:
- 當程式請求小塊記憶體時,glibc會先檢查fastbin連結串列中是否存在合適大小的空閒堆塊。
- 如果存在,則直接將該空閒堆塊分配給程式,並將連結串列中的對應節點移除。
- 如果不存在,則將該請求大小的堆塊從堆中分配出去。
- 釋放階段:
- 當程式釋放小塊記憶體時,glibc會將該堆塊放入fastbin連結串列中,而不是立即釋放到作業系統。
- 如果釋放的堆塊大小與fastbin連結串列中的某個大小匹配,則將該堆塊放入對應的fastbin連結串列中。
- 如果釋放的堆塊大小與fastbin連結串列中的某個大小不匹配,則將該堆塊直接釋放到堆中,而不放入fastbin連結串列。
- 使用階段:
- 下次程式再次請求合適大小的記憶體時,glibc會優先從fastbin連結串列中取出空閒堆塊,而不是直接從堆中分配。
- 如果fastbin連結串列中沒有合適大小的空閒堆塊,則從堆中分配。
Fastbin的使用可以減少頻繁地向作業系統請求記憶體和釋放記憶體的開銷,提高記憶體分配和釋放的效率。然而,由於fastbin連結串列中的堆塊並沒有被完全清空,因此也存在一定的安全風險,可能導致堆溢位等漏洞。因此,在編寫安全性要求高的程式時,需要謹慎使用fastbin機制。