systemhacking/background

/proc/<pid>/maps 메모리 권한, 로드중인 라이브러리 확인

qkqhxla1 2015. 2. 11. 20:17

앞에서 mprotect에 대해서 썼었는데 예로 어떤 오버플로우 공격을 했는데 내가 지정했던 리턴주소가

쓰기 권한이 없는 주소라고 하자. 그러면 해당 주소부분을 잘 덮어씌워도 내가 원하는 코드를 실행하지

않고 세그먼테이션 폴트 오류가 발생한다. 리눅스에는 maps라는게 있는데 메모리의 rwx등의 권한을

보여준다.


이처럼 백그라운드로 프로세스를 실행시킨 후 ps -ef | grep '이름' 으로 찾아보면 pid가 나오는데, 해당 pid로 maps를 출력하게 해보면 메모리에 대해서 권한이 나온다. 하지만 확실히 믿지는 말자.(maps정보가 틀린 경우도 있다고 한다.)


확실하게 권한이 있는지 확인해보려면 직접 넣어보고 실행해보면 된다.

실행권한을 확인해보자. 40013000-40014000 같은경우는 실행 권한이 없는데 한번 실행해보자.

gdb로 실행 후 아무곳이나 브레이크포인트를 잡아두고 브레이크 포인트가 걸린 지점에서 실험하자. 프로그램이 실행되지도 않았는데 메모리 주소로 접근하려고 하면 이상한 접근이 되어서 무조건 

Cannot access memory at address '주소' 라는 메시지가 뜨며 변경이 되지 않는다.

(gdb) set *0x40013001=0x41414141

(gdb) set $eip = 0x40013001

(gdb) c

Continuing.


Program terminated with signal SIGSEGV, Segmentation fault.

The program no longer exists.


메시지를 보면 알수있듯이 시그널이 발생하면서 그냥 종료된다. 

40014000-40017000 를 보자. maps의 결과에 따르면 저 주소로 실행권한이 없다. 하지만...

(gdb) set *0x40014001=0x41414141

(gdb) set $eip=0x40014001

(gdb) c

Continuing.


Program received signal SIGSEGV, Segmentation fault.

0x40014023 in ?? ()


실행해보면 제대로 실행이 되지만 주소가 이상해서 그냥 종료했다는게 보인다. 

maps를 너무 믿지 말자. 참조용으로만 사용하자. 권한을 알고 싶으면 직접 실행해본다.

'systemhacking > background' 카테고리의 다른 글

execve, execl  (0) 2015.03.09
aslr, dep, ascii_armor  (0) 2015.02.15
mprotect (메모리 권한 변경)  (0) 2015.02.10
linux background 2 (binary hacks)  (0) 2015.02.08
linux background 1 (binary hacks)  (0) 2015.02.06