티스토리 뷰

반응형

오늘 풀이할 문제는 bof. 버퍼오버플로우 취약점을 이용해 쉘을 따는 문제이다.

 

문제는 nc로 접속하여 접속하면 프로그램이 바로 실행되는 방식이기 때문에 바이너리와 소스코드는 링크로 주어졌다.

 

-nc(netcat)

TCP나 UDP 프로토콜을 사용하는 네트워크 연결에서 데이터를 읽고 쓰는 간단한 유틸리티 프로그램.

ip와 포트 번호를 이용해서 해당 ip에 접속할 수 있다.

 

 사용 방법 "nc ip/url 포트번호"

 

-바이너리

0과 1로 이루어진(binary) 프로그램의 파일. 소스코드를 컴파일한 결과이다.

바이너리를 사람이 읽을 수 있는 기계어(ex. 어셈블리)로 바꾸는 것을 디스어셈블 이라고 함.

 

 

주어진 문제의 소스코드.

func 함수를이용하여 버퍼를 오버플로우를 시켜서 "0xdeadbeef" 라고 설정 되어 있는 버퍼 값을 바꿔주어 키 인증에 성공하면 쉘이 따지는 소스코드이다.

 

 

문제 파일의 정보를 살펴 보면  32bit elf파일이고 aslr과 같은 메모리 보호 기법은 사용 되지 않은 프로그램이다.

aslr은 메모리 보호 기법으로 메모리 주소를 랜덤하게 배치함으로써 버퍼오버플로우 공격을 예방할 수 있는 보호 기법이다.

이것은 메모리 보호기법이 적용 되어 있지 않으므로 그냥 gdb 를 이용해서 변수의 주소를 확인한 뒤  바로 덮어 씌워 주면 된다.

 

 

gdb를 이용하여 func 함수의 어셈블리어 코드를 보면 29번째 줄에 나와 있듯 ebp-0x2c 주소가 버퍼시작주소이고,

40번째 줄에서 ebp+0x8 주소에 키값이 저장되어 "cafebabe"값과 비교 하는 것을 알 수 있다.

 

따라서 두 주소의 차이 (ebp+0x8)-(ebp-ox2c) 만큼인 52비트를 넣어 버퍼를 넘치게 한뒤 그 뒤에 키값을 덮어 씌우면 된다.

 

 

 

쉘 따기 성공!

반응형
Comments
댓글쓰기 폼