Hackershcool level12 = )

 

해커스쿨 FTZ 레벨12 [BOF]

 

 

 

Level 12문제도 Level11처럼 hint를 보면 setreuid함수와 gets함수로 문자열을 입력받는 것을 볼 수 있다.

12번 문제도 11번처럼 gdb로 disas main해본 결과 다음과 같았다.

 

 

①을 보면 11번 문제와 마찬가지로 스택에 16진수로 108만큼 공간을 할당 해주는 것을 볼 수 있다. 역시 10진수로 바꾸면 264바이트가 된다. 이후는 11번 문제와 같이 264바이트 + ebp 4바이트 = 268바이트를 쓰레기 값으로 채워주고 Return Address를 에그쉘의 주소로 넘겨주면 된다. 따라서 이전과 같이 공격을 해보았다.

 

 

공격한 방법이 효과가 없었으며 11번과 달리 gets로 입력받으므로 인자 전달방식을 바꿔야겠다고 생각됬고 | (Pipe)를 사용해봤다.

 

 

하지만 쉘을 얻지 못했고 나름대로의 원인과 해결법을 찾아보았다.

① Pipe는 왼쪽의 표준 출력을 오른쪽의 표준입력으로 전달한다.

② 표준입력을 지원하는 명령어인 cat을 Perl문과 같이 사용하기 위해 ‘;’으로 명령어 구분

③ '`'(Back quote)로 묶인 문자열은 명령어로 인식한다.

 

위 사진에서처럼 공격을 한다면 attackme는 제대로된 표준입력을 받지 못하기 때문에 cat 명령어를 붙여주며 이를 위해 ‘;’를 사용하여 명령어를 나눠준다. 하지만 Back quote로 묶어준다면 ';cat'자체를 명령어로 인식하여 제대로 실행하지 못하기 때문에 ‘()’를 사용하여 하나로 묶어주고 Pipe를 통해 attackme로 넘겨준다.

따라서 제대로 된 코드를 쓰면 다음과 같이 쉘이 떨어지고 Level13의 패스워드를 얻을 수 있다.

 

 

 






'WarGame > Hacker School FTZ' 카테고리의 다른 글

해커스쿨 Level16  (0) 2013.03.31
해커스쿨 Level15  (0) 2013.03.30
해커스쿨 Level14  (0) 2013.03.29
해커스쿨 Level13  (1) 2013.03.28
해커스쿨 Level12  (0) 2013.03.27
해커스쿨 Level11  (0) 2013.03.25

Hackershcool level11 = )

 

해커스쿨 FTZ 레벨11 [BOF]

 

 

 

 

Level 11로 로그인을 한 뒤 파일 목록을 보니 attackme라는 파일에 level12의 setuid가 걸려있는 것을 확인하고 hint파일을 열어보니 attackme의 소스를 확인할 수 있다.

setuid가 걸려있는 파일이 실행 중인 상태에서는 해당 파일의 소유자의 권한이 주어지므로 이를 이용해 level12의 쉘을 실행시킬 수 있다.

 

 

gdb를 이용하여 attackme 파일의 main함수 부분을 disassemble 해보면 다음과 같은 구조라는 것을 알 수 있다.

①번 코드를 살펴보면 ESP에 16진수로 108크기 만큼 Buffer 영역을 확보해주고 있다. 16진수 108은 10진수로 264이다.

버퍼의 크기는 264바이트이며 우리가 쓰레기 값으로 채워야하는 부분은 264바이트 + EBP 4바이트 = 268바이트가 된다.

 

이를 바탕으로 에그쉘을 가지고 공격을 해볼 수 있다.

 

 

우선 밑줄 친 부분을 살펴보면 크게 세 부분으로 나눌 수 있다.

첫 번째, attackme라는 프로그램의 실행

두 번째, attckme의 인자로 A라는 1바이트 문자 268개 전달

세 번째, Return Address에 들어갈 에그쉘의 주소 (①에서 나온 주소)

 

BOF 공격을 위해 에그쉘을 사용했는데 에그쉘이란 쉘코드를 입력할 공간이 적을 경우 환경변수에 올려서 사용하는 프로그램으로 Return Address의 주소로 에그쉘의 주소를 입력하게 되면 쉘이 실행된다.

에그쉘의 소스는 생략하며 환경변수에 올린 에그쉘의 주소를 얻어오기 위하여 getegg라는 프로그램을 작성하였다. getegg라는 파일을 실행시키면 ①과 같이 주소가 나오며 이 주소를 Return Address의 주소로 넣어준다.

 

<getegg.c의 소스>

 

에그쉘의 주소는 Little Endian방식이기 때문에 뒤에서부터 1byte단위로 끊어서 넣어주면 된다.

공격이 성공하면 Return Address에 들어간 에그쉘의 주소로 인해 쉘이 뜨게 되고 my-pass라는 명령어를 쳐보면 Level 12의 패스워드를 확인 할 수 있다. = )







'WarGame > Hacker School FTZ' 카테고리의 다른 글

해커스쿨 Level16  (0) 2013.03.31
해커스쿨 Level15  (0) 2013.03.30
해커스쿨 Level14  (0) 2013.03.29
해커스쿨 Level13  (1) 2013.03.28
해커스쿨 Level12  (0) 2013.03.27
해커스쿨 Level11  (0) 2013.03.25

+ Recent posts