본문 바로가기

포너블/lob

lob 1번

lob 1번 풀이입니다. 앞서 글에 Mac OS X에서 vmware설치와 기본 설정 방법, 그리고 미리 알고 있으면 좋은 명령어들을 정리해 두었으니 참고하시면 되겠습니다.

 

*1번 문제 아이디 비번은 모두 gate입니다.

가장 먼저 gate문제에 있는 gremlin.c 파일 입니다. cat grmelin.c 를 입력하면

코드를 볼 수 있습니다.

문제를 보니 버퍼의 크기는 256이고, 실행시 인자의 개수가 2개 미만이면 에러가 발생하고 종료하게 됩니다. 여기서 main함수인 인자인 argc는 입력된 인자의 개수이고, 포인터 배열인 *argv[]에는 입력된 인자가 순서대로 입력되게 됩니다. 자세한건 나중에 페이로드 사진을 보며 설명하겠습니다.

 

일단 자세한 주소를 알아야 하니 리눅스 디버거인 gdb를 이용해야 합니다. gdb 사용 시 알아야 하는 명령어도 사전 준비 글에 적어두었습니다.

 

제가 1번을 풀때는 삽질을 많이 해서 사진이 모든 과정은 나와 있지 않습니다. 일단 글로 설명하면 현재 우리는 gremlin 파일에 대한 권한이 없기 때문에 gremlin을 grem으로 복사해서 gdb를 사용할 것입니다. 아래의 사진은 복사한 파일인 grem을 file명령어로 gdb에 로드해 준 후 main함수를 까본것입니다.

지금 보면 main+54에 srtcpy 함수가 위치해 있는 걸 알 수 있고, 우리는 strcpy함수 이후의 상황에 파이썬 코드를 이용하여 ebp부분의 주소를 알아낼 것이기 때문에 breakpoint를 main+62에 걸었습니다.

지금도 사진에서 빠진 부분이 있는데

gdb에서 r `python -c 'print "A"*256'`라는 명령어를 통해 버퍼공간인 256바이트를 A로 채워서 ebp의 시작 지점이 어디인지 확인하는 코드를 실행해 주었습니다. 그리고 스택의 시작부분인 esp부분 부터 100개의 값을 확인해보았습니다.

스택을 확인해보니 0xbffffc28부터 ebp가 시작된 것을 알 수 있습니다.

이제 버퍼 부분의 주소를 확인했으니 공격을 해야 합니다. 공격은 nop슬라이드 방식을 사용했는데 코드를 실행했을때 nop을 만나면 그대로 다음 부분으로 넘어가게 되는데 이것을 이용하여 관리자 권한을 얻는 shell코드를 실행시키는 부분까지 nop을 깐다음 쭉 미끄러진다고 해서 붙여진 이름입니다. 즉 이번 문제를 예시로 들면 버퍼 256바이트+ebp 4바이트의 공간을 nop+shel코드로 채운뒤 ret값에 채운 nop중 한 군데의 주소로 리턴시켜주어 nop을 타고 내려가 shell코드가 실행되어 관리자 권한을 얻는 것입니다. 페이로드는 아래의 사진들을 참고하시면 좋을 것 같습니다. 하지만 이 방법은 복사파일의 주소만 현재 확인할 수 있기 때문에 실제 파일과 주소의 차이가 있을 수 있으므로 여러번 공격하는 brute forcing공격을 사용해 주어야 합니다.

지금 보면 제가 처음에 shell코드의 잘못으로 착각하고 여러번 공격을 시도 했지만 권한을 얻지 못하고 오류가 뜨는 부분입니다.

그래서 복사 파일에 동일한 페이로드를 보내어 코어를 생성 후 확인해보니 제가 원하는 주소로 리턴 되지않았음을 확인 할 수 있었습니다.

하지만 나중에 보니 bash2가 제대로 설정되어 있지 않았고, 그 이유로 \xff의 값이 제대로 인식되지 않았습니다. 그래서 다음과 같이 bash2를 설정해주었습니다.

다음과 같이 설정해주었습니다. bash2 설정은 제가 따로 글을 만들어서 작성해 두거나 사전준비 글에 작성해두겠습니다.

bash2설정을 해준뒤 주소값을 바꿔가면 페이로드를 보낸 결과 관리자 권한을 얻었고, lob문제에서 답을 얻을 수 있는 명령어인 my-pass 명령어를 통해 다음 문제 비밀 번호인 hello bof world를 얻었습니다.

 

*이때 주소값을 페이로드에 등록할때 gdb에서 확인한 주소는 2개씩 잘라 거꾸로 순서대로 적어주어야 합니다. 그렇게 해야 리눅스에서 우리가 원하는대로 주소를 인식합니다.

'포너블 > lob' 카테고리의 다른 글

lob 6번  (0) 2020.01.05
lob 5번  (0) 2020.01.05
lob 4번  (0) 2020.01.05
lob 3번  (0) 2020.01.04
lob 2번  (0) 2020.01.04