⊙ 문제의 소스를 보자) |
[gremlin@localhost gremlin]$ cat cobolt.c /* The Lord of the BOF : The Fellowship of the BOF - cobolt - small buffer */
int main(int argc, char *argv[]) { char buffer[16]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } + [LEVEL1]과 틀려진 거라곤 버퍼 크기가 작아진 것 밖에 없습니다. + 따라서 환경변수에 셸코드를 올려놓고, RET주소를 해당 환경변수로 합니다. |
대략적인 구성은 LEVEL1과 같으므로 바로 바로 셸코드를 환경변수에 올려봅시다.
1) 셸코드를 환경변수로.... | |||||||||||||
①셸코드를 환경변수로 올리기 전에 우리가 사용되는 메모리 공간을 봅시다.
[해당 원문 참조]
② 우리가 셸코드를 올리게 되는 곳이 저 스택영역 안에 환경변수가 사용되는 메모리 공간입니다.
② 그럼 일단 올려보고 확인해 봅시다.
+ env 명령으로 해당 환경변수를 확인할수 있습니다.
|
2) 환경변수 주소를 알아보자! |
① C언어 getenv()를 이용하자.
int main(int argc, char *argv[]) { printf ("%p\n", getenv(argv[1])); return 0; }
② 해당소스를 컴파일 # gcc getenv.c -o getenv
③ 전체 경로의 파일이름 길이가 같아야 정확한 해당주소를 받아 올 수 있으므로 해당 cobolt 바이너리 파일과 같은 위치에 있도록 하자. (이름 길이도 같음)
④ 만든 getenv를 이용하여 올린 셸코드의 주소를 알아내자. [gremlin@localhost gremlin]$ ./getenv SHCODE 0xbfffff03 |
3) 공격문 작성 | |||||||||
완료!! |
*미리 chsh로 /bin/bash2로 변경 해놓음.
gremlin : "hello bof world"
'워게임(WarGame) > BOF원정대(LOF)' 카테고리의 다른 글
[LEVEL4] goblin -> orc (egghunter) (1) | 2011.06.02 |
---|---|
[LEVEL3] cobolt -> goblin (small buffer + stdin) (0) | 2011.06.02 |
[LEVEL1] gate -> gremlin (simple bof) (1) | 2011.06.02 |
BOF 원정대 출항 준비 : 네트워크 설정 (0) | 2011.05.29 |
BOF-BufferOverflow- 원정대란? (1) | 2011.05.29 |