jam 블로그

[bof 원정대] gate -> gremlin (simple BOF) 본문

해킹/시스템

[bof 원정대] gate -> gremlin (simple BOF)

kid1412 2012. 3. 16. 21:38
728x90
bof를 기본적으로 공부할 수 있게 해주신 해커스쿨께 감사의 인사를 드립니다. ^^ 

 [그림 1] bof 원정대 입구~

gremlin의 파일을 bof 시켜야 하는데 gremlin파일의 소스코드는 다음과 같습니다. 

 [그림 2] gremlin.c 

소스분석
1. 인자값이 적어도 하나 이상이 되어야한다.
2. buffer의 크기는 256이며 첫번째 인자값을 buffer에 복사합니다.
3. buffer를 뿌려줍니다.


bof 할 방법은 환경변수에 shellcode 올려놓고 그것을 불러와서 실행하는 방법으로 할 생각입니다.

우리가 해야할 일은 다음과 같습니다.

0. bash2로 실행시키세요 (콘솔에 bash2를 치고 시작합니다. bash에 버그가 있다고 하네요)
1. shellcode 생성(또는 검색 후 가져오기)
2. shellcode를 환경변수에 올리기
3. 환경변수의 주소 알아내기
4. 주소를 바탕으로 bof시 불러오기


1. shellcode를 생성 또는 검색해서 가져옵니다. shellcode는 다음과 같습니다. 생성 방법은 추후에 공부하고 글을 작성하겠습니다.

"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80"
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh"


2. 환경변수에는 shellcode를 넣습니다.

 [그림 3] 환경변수에 shellcode 입력 


3. 환경변수의 주소를 알아내기

2번 처럼 환경변수를 제대로 넣었다면 환경변수명 shellcode가 메모리 어디에 올라가있는지 주소값을 얻어야합니다. 다음 소스는 환경변수의 주소값을 보여주는 소스입니다. 

 [그림 4] 환경변수 주소값 받아오는 소스
 
 [그림 5] 컴파일 후 shellcode 환경변수 주소값 가져오기. 


4. 주소를 바탕으로 bof 공격하기

 [그림 6] bof 공격

gremlin 파일에 perl 스크립트로 A를 260 넣고 그 다음에 shellcode 환경변수의 주소값을 순서 거꾸로 해서 넣습니다. (거꾸로 넣는 이유는 redhat은 little endian 이므로) 

공격이 제대로 되었다면 bash$이 떨어질것이고 id 쳐서 권한이 올라갔는지 보고 my-pass로 다음 레벨의 암호를 보면 됩니다. 


 
Comments