본문 바로가기

WarGAME/HackCTF

[HackCTF]Basic_BOF #2

HackCTF

Pwnable - Basic_BOF #2

 

실행해보면 입력을 받고, 의미 없는 문자열을 출력한다.

 

IDA로 열어보자. main함수의 코드를 보면, 함수 포인터 v5에 sup함수의 주소를 저장한다. 

함수 포인터
함수의 주소를 저장하는 포인터
함수가 있는 메모리의 시작 주소
선언 방법 : 리턴자료형 (*변수명)(매개변수 자료형); ex. int (*fp)(int, int);
#변수명에 함수 이름을 저장하면 된다. ex. fp=sum;

참고사이트: 함수 포인터(Function Pointer) 와 보이드 포인터(Void*) :: 천천히 흘러가도 괜찮아 (tistory.com)

 

sup함수를 확인해보면, 변수 s에 있는 값을 출력해준다는 것을 알 수 있다.

 

결국 fgets로 변수 s에 문자열을 입력받고, 저장된 걸 출력해주는 식으로 프로그램이 동작한다. 리턴 주소값을 조정해주는 것은 쉬울 것 같은데...어떻게 쉘을 따야 하는거지.. IDA로 보면 함수들 중에 쉘을 실행해줄 것 같은 함수가  하나 있었다. shell함수의 시작 주소값을 return지점에 넣어주면 될 것 같다고 원래 생각했는데, 아니다. v5에 shell함수의 시작 주소값을 넣어주면 되겠다. 위의 IDA에서 확인한 s와 v5의 위치를 이용해서 구하면, s의 위치(ebp-0x8c) - v5의 위치(ebp-c)=128(0x80) 이므로 128개의 dummy코드를 넣어주면 되겠다.

*fgets함수: FILE 구조체를 사용하여 파일 입출력 스트림에서 문장열을 가져오는 함수이지만, 세번째 인자에 stdin을 적으면 표준 입력으로도 문자열을 입력받을 수 있다.

참고: fgets 함수로 표준 입력 문자열 처리하기 : 네이버 블로그 (naver.com)

 

gdb로 열어보자. 

 

shell함수의 시작 주소(0x0804849b)를 확인했으니, 이걸 v5에 덮어주면 되겠다. dummy코드는 위에서 128개 필요한 것을 알았으므로 dummy코드 뒤에 방금 구한 주소를 넣어서 코드를 작성하면 된다.

 

 

익스플로잇 코드를 작성해보자.

 

볼 사이트:메모리 보호기법 체크 checksec.sh 사용 (tistory.com)

 

메모리 보호기법 체크 checksec.sh 사용

RELRO, Stack Canary, NX, ASLR, DEP, PIE, RELRO 등 해당파일에 리눅스 보호기법이 어느정도 걸려있는지 쉽게 체크할 수 있다. 다운로드는 여기서 http://www.trapkit.de/tools/checksec.html Examples normal..

xerxes-break.tistory.com