본문 바로가기
System Hacking/해커스쿨 L.O.B Hacking Zone

해커스쿨 L.O.B level 1 [gate]

by En_Geon 2020. 5. 16.

해커스쿨 L.O.B level 1 [gate]를 시작한다.

 

F.T.Z에서와같이 어떤 파일이 있는지 확인하고 힌트가 될만한 파일을 읽어본다.

 

ls -l 실행

 

파일이 두 개 있다. F.T.Z에서 해왔던 대로 코드를 열어서 분석해야 한다.

 

gremlin.c

 

주석은 간단한 힌트 같은 느낌이고 코드를 보면 F.T.Z 난이도와 비슷한 문제다.

strcpy복사할 때 크기를 검사하지 않기 때문에 BOF에 취약하다고 F.T.Z level 11, level 13에 나왔다.

 

gdb를 확인해 본다. 이때 gremlin.c는 gate의 권한이지만 gremlin 실행파일은 gremlin의 권한이다.

 

gdb r 명령어

 

gdb로 디스어셈블을 할 수는 있지만 gdb에서 r 명령어로 쓰려고 하면 권한 오류가 난다.

그러므로 r 명령어를 쓰려면 cp 명령어로 gate 권한의 파일로 복사해서 사용하면 된다.

 

gdb gremlin

 

gdb를 보면 0x100(256)byte 확보하고 strcpy 함수에서까지 ebp가 256이다. 그렇다면 이 사이에 더미가 없다는 뜻이다.

 

더보기

 

이 문제는 정말 F.T.Z에 있어도 될만한 난이도의 문제다. 

변수 사이에 더미도 없고 크게 어려운 코드도 없다.

 

그렇다면 간단하게 생각할 수 있다. 셸 코드를 환경변수에 넣어주고 셸 코드 주소를 getenv 함수로 찾아서 그 주소에 공격하면 된다.

 

문제 풀이 전에 공격 실패 사례들을 알려주려고 한다.

 

여기서 F.T.Z level 11에서 처음 썼던 eggshell을 생각할 수 있는데 어떤 이유에서인지 eggshell을 사용해서 주소를 얻어오면 공격이 이루어지지 않는 걸 확인했다. 이것 때문에 하루가 없어졌다.

 

eggshell로 되지 않는다면 export로 셸 코드만 넣는 방법이 있다. 기본적으로 25byte 셸 코드를 사용한다.

그런데 여기서 또 무슨 오류가 있는지 25byte 셸 코드를 export로 넣어주면 공격이 이루어지지 않았다.

왜 안되는지 짜증이 난 상태로 검색을 해보다가 야무미르님의 블로그에서 25byte 셸 코드가 안된다는 것을 알게 되었다.

그래서 eggshell에서 쓴 셸 코드만 가져와서 export로 넣어서 공격했더니 아주 간단하게 공격이 이루어졌고, 41byte 셸 코드도 공격이 이루어졌다. 

L.O.B에서는 eggshell을 사용하면 공격이 안 될 것 느낌을 하루 동안 받았으므로 L.O.B에서는 사용하지 않고 export로 사용할 예정이다.

 

다시 문제 풀이로 넘어간다.

 

export egg

 

export로 EGG라는 환경변수를 넣어준다. 이 셸 코드는 eggshell에서 쓰던 코드를 가져온 것이다.

export의 기본값 "export [변수명]=[환경변수 값]" 이다. 이때 변수명과 환경변수 값 사이에 "="는 띄어쓰기하면 데이터로 인식하여 오류가 나기 때문에 띄어쓰기하면 안 된다.

 

환경변수를 등록했으면 환경변수 주소를 알려주는 getenv를 작성한다.

 

getenv

 

getenv를 실행해서 주소를 알아본다.

 

getenv 실행

 

주소를 알았고 스택의 상황을 알았으니 공격하면 된다. 스택을 도식화하면 이렇게 된다.

 

char buffer[256] 256byte
SFP 4byte
RET 4byte


dummy도 없이 간단하다. SFP까지 BOF를 해야 하므로 260byte의 BOF를 일으키면 된다.

 

공격 실행

 

공격하게 되면 gremlin의 셸이 실행된다. 여기서는 F.T.Z에서처럼 setreuid 함수도 없고 setreuid가 들어간 셸 코드가 아닌데 셸이 나오는 건 실행파일이 gremlin의 권한, 그룹권한을 다 가지고 있어서 나오는 것 같다.

정확하게 아시는 분을 알려주시면 감사하겠습니다.

 

댓글