#About


[그림 1] - orge.c 소스 코드 확인




#Solution


[ + ] 소스 코드 해석


1. 외부 다른 소스파일에 있는 environ 포인터 변수 사용


2. buffer라는 배열에 40바이트 및 변수 i 선언


3. 조건문을 통해 인자 값을 검사하며 2개 미만일 경우 argv error를 출력 후 종료


4. argv[0] 즉, 실행파일의 이름이 77바이트가 아닐 시 argv[0] error를 출력 후 종료


5. 반복문을 이용하여 환경변수에 담긴 값의 길이만큼 메모리에서 초기화


6. 조건문을 통해 사용자 입력 값 중 48번째 바이트가 \xbf가 아니면 stack is still your friend.를 출력하고 종료


7. 사용자 입력 값인 첫 번째 인자 값의 길이가 48바이트가 넘어가면 argument is too long!을 출력하고 종료


8. 사용자 입력 값을 buffer에 복사 후 buffer에 들어있는 사용자 입력 값 출력


9. memset 함수를 이용하여 buffer 값 전부 초기화


이전 문제들과 달리 해당 문제에서 추가 된 것은 argv[0]의 조건이다. argv[0]은 파일을 실행함에 있어 필요한 경로를 의미하며

아래와 같이 orge의 이름을 75개의 A로 변경해주었다


[그림 2] - orge > 75자리 A로 이름 변경


위와 같이 이름을 변경해준 뒤 파일명이 75글자인 B를 만들어 임의의 페이로드를 작성해 core 덤프 파일을 생성 해주었다


[그림 3] - core 덤프 파일 생성


다음으로 core 파일을 분석하기 위해 -c 옵션을 주어 아래와 같이 메모리 확인결과 buffer의 시작주소는 0xbffffb82임을 확인할 수 있었다


[그림 4] - buffer 시작 주소 확인


 buffer의 시작주소를 알았으니 아래와 같이 RET 주소를 buffer의 시작 주소로 변조하는 페이로드를 작성할 수 있다


| \x90 (20byte) | 셸 코드 (24byte) | buffer의 시작 주소 |


[그림 5] - 셸 획득


+ Recent posts