[Dreamhack] War Game 1단계 - Pwnable basic_exploitation_000
문제
- NX 기법 미적용 확인
- 쉘코드 삽입 가능할 것으로 판단
소스코드
- initialize 함수에서 실행 이후 정해진 시간 초과시 alarm_handler 함수에 의해 “TIME OUT” 문자열 출력 후 종료
- main 함수에서 buf 크기 128바이트로 할당
- initialize 함수 실행 후 printf로 버퍼 출력하고 scanf로 141바이트 크기만큼 버퍼에 입력받음
- buf의 크기는 128byte인데 141바이트를 입력받기 때문에 Buffer OverFlow 발생
- Buffer OverFlow와 스택프레임 설명은 basic_expoitaion_001 참고
- buf와 sfp에 쉘코드와 특정 값으로 132byte((buf=128) + (sfp=4))를 채워넣고
- NX 기법 미적용으로 쉘 코드 삽입 가능
- ret주소에 132byte(buf,sfp)에 있는 쉘 코드 주소를 넣어 쉘 코드를 실행하여 권한을 탈취해보자
- buf의 크기는 128byte인데 141바이트를 입력받기 때문에 Buffer OverFlow 발생
KALI
- 서버를 연결했더니 buf의 주소가 뜸
- 이 주소 처음 부분에 쉘코드를 넣고 나머지는 특정 문자로 채워넣는 payload를 작성해보자
- 먼저 서버로 원격접속을 위해 remote하고
- main함수에서 출력할 때 buf = (0xfffeb628)로 출력되므로 “buf = (“ 를 제외하여 실 주소값만 취한다.
- 그 다음 buf 주소 10자리를 16진수로 정수형으로 buf_addr에 저장하고
- 먼저 26byte 쉘코드를 저장한 code를 선언해주고
- 여기서 일반적으로 사용하는 25byte 쉘 코드를 사용하지 않는 이유는
- scanf 함수의 \x09, \x0a, \x0b, \x0c, \x0d, \x20를 읽지 못하는 특징 때문이다.
- 다음으로 132byte에서 26바이트를 제외한 106 바이트를 특정 값으로 채워주고
- 마지막으로 리틀엔디안 패킹 방식(p32)으로 buf 주소값을 덮어 ret 에서 실행되도록 했다.
- python 코드를 실행하여 cat flag를 해보면
- 정답을 도출할 수 있다.
결과
DH{465dd453b2a25a26a847a93d3695676d}