gate --- gate
우선 gate의 디렉토리를 확인한다.
gremlin이라는 의심스러운 파일이 존재한다. gremlin은 gremlin의 권한을 가지고 있과, setuid가 걸려있는 파일이다.
gremlin.c를 가지고 gremlin 파일을 만들었을 가능성이 있기 때문에 gremlin.c 파일을 본 뒤 어떤 취약점이 있는지 확인해보자.
배열이 하나 선언되어 있다. (char buffer[256])
우리는 gremlin을 실행할 때 1개의 인자를 전달해야한다. (if(argc<2))
1개의 인자를 buffer에 전달한 뒤 출력한다.
gremlin의 메모리 구조를 그려보면 아래와 같이 그려볼 수 있다.
하지만 실제 배열이 할달되면서 중간 중간에 gcc가 자동적으로 dummy를 생성할 수 있다.
따라서 정확한 크기를 알기 위해 gdb로 분석해보자.
dummy가 추가적으로 생성되지 않았음을 확인할 수 있다.
공격을 하는 방법은 크게 두가지가 있다.
1. 환경변수에 쉘코드를 등록하고 RET에 쉘코드의 환경변수 주소로 write 한다.
dummy[260](buffer + SFP) + RET 형태로 공격을 진행해야 한다.
2. buffer[256]이 쉘 코드를 write하기에 충분히 크기 때문에 buffer[256]에 쉘코드를 작성하고 RET을 버퍼의 주소로 write 한다.
25 byte의 쉘코드 = "\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"
성공확률을 높이기 위해서 NOP 패딩을 진행할 것이다. 235 byte의 NOP padding이 필요하다.
235 byte의 NOP padding + 25 byte의 쉘코드 + buffer의 주소 로 공격코드를 작성할 것이다.
buffer의 주소를 일반적으로 gdb를 이용해서 buffer의 주소를 확인하려고 하겠지만 다음과 같이 어떠한 작업을 하려면 permission denied 된 것을 알 수 있다.
이런 상태를 해결할 수 있는 가장 쉬운 방법은 기존의 파일을 복사하는 것이다.
gremlin을 gremlincp로 복사하면 내용은 그대로 복사되면서 권한이 바뀌는 것을 확인할 수 있다.
이제 복사한 gremlincp를 가지고 분석한 뒤 gremlin에 공격을 진행하면 된다.
`perl -e 'print "A"x256'`을 이용해 인자를 넘기고 있다 0x41414141이 0xbffff948부터 시작하는것을 보아 buffer의 주소가 0xbffff948임을 알수 있다.
buffer의 주소를 이용해 공격을 진행하자.
다음과 같이 쉘코드를 통해서 성공적으로 공격에 성공할 수 있다.
'Wargame > LOB' 카테고리의 다른 글
해커스쿨 LOB wolfman 풀이, write-up (0) | 2018.08.13 |
---|---|
해커스쿨 LOB orc 풀이, write-up (2) | 2018.08.12 |
해커스쿨 LOB goblin 풀이, write-up (0) | 2018.08.12 |
해커스쿨 LOB cobolt 풀이, write-up (0) | 2018.08.10 |
해커스쿨 LOB gremlin 풀이, write-up (0) | 2018.08.09 |