[Wargame Write-up]/Lord of Buffer Overflow
[LoB RedHat 6.2] LEVEL 18: succubus -> nightmare
Kevin S.
2018. 8. 21. 06:30
LEVEL 18: plt
오랜만에 LoB 카테고리에 글을 남긴다.
buffer 크기는 40이고 strcpy@plt를 꼭 사용해야만 하는 구조로 되어 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /* The Lord of the BOF : The Fellowship of the BOF - nightmare - PLT */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dumpcode.h> main(int argc, char *argv[]) { char buffer[40]; char *addr; if(argc < 2){ printf("argv error\n"); exit(0); } // check address addr = (char *)&strcpy; if(memcmp(argv[1]+44, &addr, 4) != 0){ printf("You must fall in love with strcpy()\n"); exit(0); } // overflow! strcpy(buffer, argv[1]); printf("%s\n", buffer); // dangerous waterfall memset(buffer+40+8, 'A', 4); } | cs |
우선 바이너리 복사 후 gdb에서 strcpy@plt의 주소를 확인하자.
strcpy@plt 주소: 0x8048410
공격 페이로드를 아래와 같이 구성할 예정이기 때문에, 영역이 구분되도록 알파벳으로 배치하여 실행 후 core 파일을 떨어뜨린다.
쉘코드는 환경변수에 등록해 사용할 것이다.
[ Dummy1 (40) ] [ SFP (4) ] [ &strcpy (4) ] [ Dummy2 (4) ] [ strcpy argv[0] (4) ] [ strcpy argv[1] (4) ] [&shellcode ]
core 파일 분석 결과 기존에 BBBB가 들어가야 할 자리에 AAAA로 치환되어 들어가 있는 것을 확인할 수 있다.
하얀 박스로 표시한 2개는 각각 strcpy의 첫 번째(argv[0]), 두 번째 인자(argv[1])가 될 것이다.
각각의 주소는 아래와 같다.
argv[0]: 0xbffffa90
argv[1]: 0xbffffa9c
SHELLCODE라는 이름으로 쉘코드를 등록할 것이기 때문에, 그 쉘코드가 있는 주소를 확인할 코드를 작성해두자.
1 2 3 4 5 6 | #include <stdio.h> #include <stdlib.h> void main(void) { printf("SHELLCODE: %p\n", getenv("SHELLCODE")); } | cs |
SHELLCODE라는 환경변수에 쉘코드 바이너리를 넣은 후, 쉘코드의 주소를 파악하면 된다.
shellcode 주소: 0xbffffec1
지금까지 모은 재료들을 이용해 페이로드를 구성하면 succubus 권한의 쉘을 얻을 수 있다.