본문 바로가기
보안과정/리버싱

Level 10 → Level 11

by Luuii 2017. 11. 30.

www.hackerschool.org 를 이용하여 공부한다.


목적 : 공유 메모리에 데이터를 쓰고 읽기


프로세스와 프로세스의 통신(메시지를 주고 받는 방법) 

> 소켓을 사용하는 경우(Ex: Client/Server 프로그램)

> 공유메모리를 사용하는 방법(Ex: DB 프로그램(Oracle))

> 파일을 사용하는 경우

> DB 사용하는 경우

> 기타


보안적인 요소에서 공유메모리를 쓰고 있는 대표적인 경우

> 암호화/복호화 방식(핵심 : key)


공유메모리를 사용하는 방법

> 메모리의 일부분을 띄워서 공유메모리로 해주고 P1과 P2를 조인시켜준다.

> DB프로그램들이 이런 작업을 많이 사용하고 있다. 고속으로 통신하는데

> 하나의 프로세서가 공유메모리에 올리면 다른 프로세서가 이것을 참조해서 한다.


파일을 사용하는 경우와 DB를 사용하는 경우도 광범위하게는 비슷비슷하다.


가장 초창기에 쓰이던 방식은

어떤 프로그램을 실행 했을 때 암호가 이 안에 들어있으면 내가 입력한 암호를 여기서 비교하는 방식


두번 째는

코드 상에서 폴더를 지정하고 파일을 지정한다. 라이센스 파일이라는 것을 지정하고 이 폴더 밑에있는 파일을 읽어들여서 복호화 작업을 해서 그 키 값이 맞으면 정상 동작.

해커가 상대편 시스템에 침입하면 이 파일을 다 알수있고 마음대로 조작할 수 있다.


세번 째는 이 파일을 외부의 서버에서 제공하는 방법

 키를 제공하는 서버가 있다. 그래서 얘가 부팅을 하면 얘한테 키값을 받아온다. 그래서 키 값을 파일로 저장한다.

프로그램이 꺼지면 부팅 할 때 다시 받아온다. 켜져있는 동안에만 사용한다.


그래서 그 뒤에는 파일을 쓰지 않고 메모리를 쓰는 방식

쓰지 않고 메모리에 상주 시켜 놓는다. 이 파일은 재부팅 되면 항상 다시 받아와야하고 파일 상으로는 존재하지 않기 때문에 찾기가 쉽지 않다.


그래서 해커들은 메모리를 뒤지기 시작했다. ssh도 그렇고 https도 그렇고 초기에 클라이언트가 서버에 접속했을 때 마스터키라는 것을 받는다.

그게 꼭 있어야지 복호화가 가능하다. 그것을 메모리에 상주시켜놓는 것이다.


public key는 암호화. private key는 복호화.

자기 데이터를 암호화 시켜서 보내야 한다. 그럼 상대편은 복호화해야한다.

키가 거꾸로 되야하는 것이다. 그래서 중간에 그것에 상응하는 키. 암호화 할 때 사용하는 키를 클라이언트한테 준다.

그 동작을 위해서 클라이언트가 서버에 붙으면 마스터키라는 것을 주는데 그것을 메모리에 둔다.

이 방식이 보안에서도 많이 쓰인다.


level10 사용자로 로그인

ID : level10

PASS : interesting to hack!


$ ls -l

$ cat hint

> 이 번호만 있으면 공유메모리에 접근 할 수 있다.


$ find / -user level11 -perm -4000 2>/dev/null

$ find / -user level11 2>/dev/null

결과가 나오지 않는다.


$ find / -type f -exec egrep -l /home/level10/program {} \; 2>/dev/null


$ cat /etc/rc.d/rc.local

> 운영체제가 기동이 될 때 실행될만한 프로그램을 이 안에 정의. 로그인 창이 뜨기 바로 직전에 실행.


$ ps -ef | grep level

> /home/level10/program/level10 프로그램은 데몬 모드로 동작하는 것은 아니고 일반 프로세스 형태로 한번 실행되고 끝나는 것 같다.



[참고][클릭] 공유 메모리 관련 함수에 대하여


논점 : 공유메모리에 접근 할 수 있는가?

$ cd tmp

$ vi shm.c

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
#include <stdio.h>
#include <sys/shm.h>
#include <sys/types.h>
 
#define BUFFSIZE 1024
 
int main()
{
        void *sharedMemory=(void *)0;   
        int sharedMemID;
        char buf[BUFFSIZE];
        key_t keyval=7530;
 
        // 공유 메모리의 ID를 읽어 온다. -> 생성할 수도 있고 접근 할 수도 있고.
        sharedMemID=shmget(keyval, BUFFSIZE, 0666); //지금은 접근하겠다.
 
        // 프로세스에서 공유 메모리 공간을 사용할 수 있게 연결(Attach) 한다.
        sharedMemory=shmat(sharedMemID, (void *)00);
        
        // 공유 메모리 공간에 있는 값을 특정 변수에 복사한다.
        memcpy(buf, sharedMemory, BUFFSIZE);
        printf("%s", buf); 
        // 이 공간에 있는 걸 내가 버퍼에 저장하겠다. 크기는 충분히 잡아주면 되겠지. 다 안 떠지면 늘리면 되는거고
 
        // 프로세스에서 공유 메모리의 연결을 분리(Detach)한다.
        shmdt(sharedMemory);
 
        return 0;
}
cs


$ gcc -o shm shm.c

$ ./shm


반응형

'보안과정 > 리버싱' 카테고리의 다른 글

Level 11~20 문서 합본  (0) 2017.12.17
Level 9 → Level 10  (0) 2017.11.30
Level 8 → Level9  (0) 2017.11.30
Level 7 → Level 8  (0) 2017.11.29
Level 6 → Level 7  (0) 2017.11.29