티스토리 뷰

 

카테고리

PWNABLE

 

문제

32 bit elf 바이너리인 easy_uaf 파일이 주어졌다.

 

변수 선언 시점에 5개의 변수에 각각 malloc이 이루어진다.

 

이 중 세 번째 할당된 ptr에는 flag의 값이 기록된다.

 

그 후에는 while(1) 을 통해 메뉴가 반복되는데,

  1. hi
  2. write
  3. delete
  4. print
  5. exit

총 5개의 메뉴가 있다.

 

 

1번 메뉴인 hi는 "hi~ easy uaf, layer7"이 출력된다.

쓸모 없는 메뉴이다.

 

2번 메뉴인 write는 초기에 malloc해놓은 5개의 영역에 글을 쓸 수 있는 메뉴이다.

"what ? > "이라는 물음이 나왔을 때 1을 입력하면 buf에, 2를 입력하면 s에, 3을 입력하면 ptr에, … 등등 선택 가능하다.

또한 주목할 점은, 할당된 공간이 0x3F이지만 0x100 바이트 만큼의 입력이 가능하여 Heap Overflow가 발생할 수 있다.

 

3번 메뉴인 delete는 free함수를 사용하여 할당된 공간을 0으로 초기화시키며 해제한다.

각각의 공간(buf, s, ptr, v36, v37)은 해제될 때 각각 v21, v22, v23, v24, v25 변수를 1로 설정한다. (초기값은 0)

 

4번 메뉴인 print는 각각의 공간이 해제될 때 설정되는 변수들(v21, v22, v23, v24, v25)의 값을 확인하여 1이면,

즉, 해제되었다면 출력하고 그렇지 않다면 "nono kk"를 출력한다.

 

5번 메뉴인 exit는 프로그램을 종료시킨다.

 

 

세 번째 공간인 ptr에 flag의 값이 기록되므로 이 값을 3번 메뉴인 print로 출력하고 싶지만

print를 하기 위해서는 delete를 먼저 해야하고 이때, 해당 공간은 0으로 초기화된다.

ptr의 값을 출력할 수 없는 상황이다.

 

이때 눈에 들어온 것은 2번 메뉴인 write 함수에서 발생하는 Heap Overflow와 4번 메뉴인 print 함수에서 사용하는 strlen 함수였다.

malloc을 할 경우 일반적으로 차례대로 공간이 할당되는데, 두 번째 공간인 s의 영역에서 Overflow를 발생시켜 ptr의 직전까지 문자열을 입력한다면 strlen 함수는 ptr의 문자열도 이어진 문자열로 생각하여 널 문자를 만날 때까지의 길이를 계산할 것이다.

 

주의해야 할 것은,

delete를 할 때도 strlen을 사용하여 0으로 초기화하므로 delete를 제일 먼저 하여 v22의 값을 1로 설정해주고

그 후에 write를 사용하여 2번 영역인 s에 데이터 입력하여 Heap Overflow를 발생시키고

print 메뉴를 사용하여 2번 영역을 출력하면 3번 영역에 있는 flag의 값도 이어져서 출력된다.

 

 

exploit

 

딱히 UAF 같지 않은 문제였다.

댓글
댓글쓰기 폼
공지사항
Total
8,807
Today
2
Yesterday
3
링크
TAG
more
«   2019/08   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함