id : cobolt
pw : hacking exposed
1. 파일 목록 확인, 소스코드 분석
파일 목록을 확인하니 goblin 파일이 눈에 띈다.
goblin.c 내용을 보면 gets함수로 입력받아 입력값을 buffer에 저장하고, 이 buffer 내용을 출력하는 코드이다.
gets 함수는 입력 받은 값의 길이와 이것을 저장할 공간의 길이를 확인하지 않고 그냥 넣어버리기 때문에 버퍼오버플로우 공격에 취약한 대표적인 함수 중 하나이다.
이 취약점을 이용해 BOF를 일으킬 것이다.
일단 goblin을 실행해 봤더니 입력값을 받게 되어있고, 입력한 그대로 출력된다.
buffer 크기보다 큰 값을 넣었더니 정상 실행은 되지만 Segmentation fault 경고가 나왔다.
gdb로 보니 buffer가 딱 16의 크기이다. 따로 더미 값은 없는 것으로 보이고, stf의 크기가 4인 것 같다.
2. 쉘코드 환경변수 등록, 환경변수 주소값 확인
이번에도 환경변수와 쉘코드를 이용해 해결했다.
export로 환경변수 sh를 등록했다. nop을 100개 넣어주고, 15비트 쉘코드를 넣어 실행하면 쉘이 열리게 했다.
env로 환경변수 목록을 확인하니 내가 등록한 sh를 볼 수 있다.
환경변수의 주소값을 출력하는 프로그램 getenv를 만들기 위해 vi getenv.c로 소스코드를 작성했다.
getenv 안에는 내가 등록한 환경변수 이름을 넣어주면 된다. 나는 sh를 넣었다.
gcc명령으로 컴파일 해 getenv 실행파일을 생성하고 실행하면 주소값이 출력된다.
3. BOF 발생시켜 쉘 실행 -> 비밀번호 획득
buffer의 공간을 덮어쓰기 위해 python으로 A를 20개 넣고, 환경변수 값을 입력하면 내가 export한 sh로 가게 되어 쉘이 열린다.
환경변수 뒤에 ;cat을 넣는 이유는
;cat을 넣지 않을 경우 EOF에 의해 쉘이 바로 종료되기 때문에
;cat을 넣음으로써 파일이 읽기 중인 상태이어야 쉘이 닫히지 않고 유지된다고 한다.
| 는 파이프(pipe)로, 이전 명령의 결과값을 이후 명령의 입력값으로 넣고 싶을 때 사용한다.
쉘이 열리면 my-pass로 다음 단계 비밀번호 획득!
근데 원래 쉘이 열리면 > 라던가 $ 같은 기호가 생겼는데 이번처럼 아무 기호 없이 커서 존재만 있을때에도 있나보다. 처음엔 쉘이 안열리는 줄 알고 왜 안열리지.. 하고 고민했다.
비밀번호 : hackers proof
배운 것
gets함수처럼 입력값을 넣어줘야 하는 함수의 경우 파이프(|)를 사용하면 된다.
환경변수로 쉘을 열 때 ;cat을 넣어야 쉘이 닫히지 않고 유지된다.
환경변수와 쉘코드로 BOF 공격 하는 것 익숙해짐
'해킹 공부 > 시스템 해킹' 카테고리의 다른 글
해커스쿨 LOB level 5 orc (0) | 2022.04.03 |
---|---|
해커스쿨 LOB level 4 goblin (0) | 2022.03.27 |
해커스쿨 LOB level 2 (0) | 2022.03.20 |
해커스쿨 LOB level 1 (0) | 2022.03.20 |
해커스쿨 FTZ level12 - gets 취약점, 버퍼오버플로우(BOF) (0) | 2021.11.28 |