해킹 공부/시스템 해킹

해커스쿨 FTZ level11 - 환경변수, shellcode, BOF

O'bin 2021. 11. 23. 20:14

id :  level11

pw :  what!@#$?

 

 

 

<나의 풀이 기록>

 1.  파일 목록 확인(ls) 후 힌트 파일 내용 확인(cat hint)

소스 코드 내용을 간단히 살펴보았다.

 

 

여기서 strcpy함수가 버퍼오버플로우 공격을 가능하게 하는 취약점이다.

이 함수는 복사하는 문자열의 길이를 검사하지 않기 때문에

str로 복사되는 argv[1]의 크기가 str의 크기 256을 초과하는 것이 가능하고, 이것을 이용해 버퍼오버플로우 공격을 하는 것이다.

 

 

 

 

 2.  attackme 파일 내용 확인

위 파일 목록에서 눈에 띄는 것이 처음 보는 attackme 파일이다. 이것이 문제풀이의 핵심이 될 것이다.

 

attackme 파일의 내용을 확인(cat attackme)해 보려고 했다.

내가 공격당한듯..

 

이게 아닌가보다.. attackme를 실행해보았다.(./attackme)

 

 

아무것도 입력하지 않고 실행했을 땐 sementation fult가 출력됐고,

인자값을 입력하면서 실행하면 입력된 값이 그대로 출력되었다.

 

1,2번 과정으로 보아 hint파일의 소스가 attackme 프로그램의 소스일 것으로 추정된다.

 

 

 3.  attackme의 파일 정보를 살펴보니(ls -al) level12에 setuid가 걸려 있다.

 

 

앞서 몇 번 했던 것 처럼 level12의 쉘을 얻어야 attackme에 대한 접근이 가능할 것이다.

 

 

 

 4.  attackme의 소스코드를 알려줬으니 자세히 뜯어보기 위해 같은 내용의 파일을 하나 만들기로 했다.

cd tmp : tmp 디렉토리로 이동

vi attackme.c : attackme.c 파일 생성

힌트 파일 소스 내용 그대로 입력(드래그로 블록을 잡고 마우스 오른쪽 버튼을 누르면 복사&붙여넣기 된다.)

esc + :wq : 입력 내용 저장 후 vim편집기 종료

gcc -o attackme attackme.c :  attackme.c파일을 attackme라는 이름의 실행파일로 컴파일

 

 

 

 5.  gdb로 attackme 프로그램 분석

 

 

ebp-264부터 입력값이 들어가게 된다

str배열의 크기가 256byte였으므로 8byte(264-256)는 dummy값이다.

 

 

268만큼 오버플로우를 일으켜야 한다.(왜냐하면...이건 나중에... 더 공부하고 채우겠다.....)

 

 

 

 6.  환경변수 입력

 

RET(return address)에 환경변수의 shell코드를 넣었다.

 

셸코드(shellcode)란? 

더보기

컴퓨터 보안에서 셸코드(shellcode)란 작은 크기의 코드

일반적으로 명령 셸을 시작시켜 그곳으로부터 공격자가 컴퓨터를 제어

일반적으로 어셈블리어로 작성되고 기계어로 변경됨

 

흔히 알려진 25byte 셸코드

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80

 

 

export : 환경변수 등록

env : 등록된 환경변수 확인

env 입력 후 아래쪽을 보니 내가 등록한 환경변수 sh가 보인다. 글자가 깨진 것 같지만 일단 계속해보기로 했다.

 

 

 

 7.  환경변수를 출력하는 프로그램을 하나 만들었다.

vi env.c : env.c라는 이름의 파일 생성

아래 소스코드 입력

#include <stdio.h>

int main(){

printf("%p\n", getenv("sh"));

}

esc + :wq : 파일 저장후 편집기 종료

gcc -o env env.c : env.c 파일을 env 실행파일로 컴파일

파일 목록 확인(ls)

env 파일 실행(./env)

환경변수 주소 출력

 

 

 

 8.  오버플로우 발생시켜 비밀번호 획득

 

 

내가 새로 만든 attackme 파일이 아니라 원래 있던 파일에 시도하기 위해 홈 디렉토리로 돌아왔다.(cd ~)

attackme 파일을 실행하는데, A를 268개 넣어 오버플로우 발생시키고 환경변수 주소(0xbffffec0)로 가도록 했다.

 

환경변수 주소는 아래 그림처럼 뒤에서부터 두개씩 묶어 넣어주면 된다.

 

 

이렇게 하면 쉘이 실행되는데, id를 입력해서 확인 해 보면 uid가 level12로 상승된 것을 볼 수 있다.

이제 my-pass를 입력해 비밀번호를 얻었다. 

 

 

 

 

<풀이 요약>

1. 파일 목록 확인(ls) 후 힌트 파일 확인(cat hint)
2. attackme 파일 내용 확인
3. attackme 파일 정보 확인
4. attackme와 같은 내용 파일 생성
5. gdb로 attackme 프로그램 분석
6. 환경변수 입력
7. 환경변수 출력 프로그램 생성
8. 오버플로우 발생시켜 비밀번호 획득

 

 

 

 

 

 

아아아아아아아아.............이번엔 진짜 어려웠다. BOF의 기초가 부족하다 보니 정답을 인터넷으로 찾아봐도 이해가 가지 않을 정도였다. 지금은 어찌저찌 찾고 이해해서 정리해 봤지만 사실 부실하게 정리했다... 더 공부해야겠다