티스토리 뷰
카테고리
PWNABLE
문제
32 bit elf 바이너리인 easy_uaf 파일이 주어졌다.
변수 선언 시점에 5개의 변수에 각각 malloc이 이루어진다.
이 중 세 번째 할당된 ptr에는 flag의 값이 기록된다.
그 후에는 while(1) 을 통해 메뉴가 반복되는데,
- hi
- write
- delete
- 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 같지 않은 문제였다.
'해킹 > CTF' 카테고리의 다른 글
[WhiteHat Contest 12] Misc002 write-up (1) | 2016.09.11 |
---|---|
[2016 Layer7 CTF] ECHO_SYSTEM write-up (0) | 2016.09.06 |
[2016 Layer7 CTF] EASY FSB write-up (0) | 2016.09.06 |
[2016 Layer7 CTF] SANITY CHECK write-up (0) | 2016.09.06 |
[2016 Layer7 CTF] LOGIN WITH ADMIN ! write-up (0) | 2016.09.06 |