본문으로 바로가기


파일 정보


파일 실행


분석


read_from_library() 함수와 add_element_to_library() 함수에 들어가는 버퍼를 이용하여 오버플로우를 발생시킬 수 있으며
NX가 설정되어 있지 않으므로 입력 값에 쉘코드를 올리고 실행하는 형태로 가면 될거 같다.

버퍼오버플로우 벡터 지점은 add_element_to_library() 함수에 존재한다.



문제는 스택 주소가 랜덤하기 때문에 Return Address 영역으로 스택에 존재하는 버퍼주소를 넣기 힘들다.

따라서 read_from_library() 함수를 이용하여 주소를 알아내야 하는데

여기서 버퍼 입력 지점을 사용자가 입력한 인덱스를 기준(&a1[index])으로 입력하게 되는데 이 인덱스가 1024보다 크면
프로그램이 종료되지만 signed 처리를 하게 되므로 음수 값을 이용하여 버퍼보다 더 낮은 메모리 주소로 접근이 가능하므로
버퍼주소를 이용하여 더 낮은 스택프레임에 접근할 수 있다. 이를 이용하여 현 시점의 버퍼의 주소를 알아내서
add_element_to_library()의 Return Address 영역을 버퍼의 주소로 Write 한다.


각 함수는 다음과 같은 행동을 한다.

add_element_to_library()

1. 인덱스를 입력받아서 배열에  저장한다.(len[num])

2. num 값을 증가한다.(++num)

3. 배열에서 이전 인덱스 값을 읽어와서 버퍼 주소를 기준으로 해당 인덱스에 사용자가 입력한 문자열을 기록한다.

-> idx = len[num - 1]; gets(&buf[idx])


read_from_library()

1. 배열의 현재 인덱스를 읽어온다.(idx = len[num])

2. 버퍼 주소를 기준으로 인덱스 지점에 있는 문자열을 출력한다.(puts(&buf[idx]))


간단하게 공격 순서는 다음과 같다.

1. add_element_to_library()를 호출하여 add_element_to_library()의 Return Address 영역을 위치하게 인덱스를 입력한다.
(이 후 2번째 입력 시에는 입력 문자열이 Return Address 영역부터 덮어씌어지게 됨)

-> 인덱스 입력 시 -32를 입력

2. 버퍼에 입력받는 문자열에 shellcode를 입력한다.

3. read_from_library() 함수를 호출하여 4 Byte 뒤에 있는 버퍼의 주소를 얻어낸다.

4. add_element_to_library() 함수를 호출하여 얻어낸 버퍼의 주소를 입력한다.(이 때 RET 영역이 OverWrite)

5. 쉘을 획득한다.


공격 수행(Exploit)


'CTF > Hacking Defense Contest' 카테고리의 다른 글

[PoliCTF 2015] Reversing - reversemeplz  (0) 2015.07.14
[PoliCTF 2015] Crack Me If You Can  (1) 2015.07.13
[PoliCTF 2015] Hard Interview  (0) 2015.07.13
[Volga CTF 2015] joy - relax & enjoy  (0) 2015.05.07
[Volga CTF 2015] Crypto - rsa  (0) 2015.05.07