- 공유 링크 만들기
- X
- 이메일
- 기타 앱
golem.c 의 소스코드는 다음과 같다.
[ret] 을 제외한 버퍼의 모든 문자열 및 프로그램 시작시 주는 매개변수 환경변수등을 모두 0으로 덮는다.
그러므로 우리가 버퍼를 이용하여 조작할 수 있는 값은 [ret]뿐으로 보인다.
그렇다면 buffer, argv, env 와 같은 위치를 제외한 어딘가에 쉘코드가 올라가야 한다.
'LD_PRELOAD' 환경변수는 특정 라이브러리를 프로그램이 시작될 때 pre load 해주는 기능을 한다.
그래서 이 LD_PRELOAD 기능을 이용하여 원본 라이브러리 함수들을 hooking하기도 한다. 하지만 LD_PRELOAD 환경변수를 이용하여 실제 라이브러리가 등록되기 위해서는 실행중인 프로세스의 권한과 라이브러리의 권한이 서로 맞아야 한다. root 권한의 라이브러리라면 어떠한 프로그램에도 적용 될 것 같고, root가 아니라면 uid가 서로 같아야 할 것이다.
결론은 LD_PRELOAD 환경변수에 등록된 라이브러리를 미리 로드하는 과정에서(실패를 했든 성공을 했든.) 메모리에 환경변수 값인 파일경로가 올라간다는 것이다. 나중에 level19에서도 알겠지만 이 파일경로가 올라가는 메모리 주소는 main함수가 시작되는 스택주소에서 -3000 정도 떨어진 곳에 size 3000 정도로 존재하는 것 같다.(이 위치 어딘가에 문자열이 존재한다.)
결론은 "LD_*" 관련 환경변수를 (라곤 하지만 LD_LIBRARY_PATH 와 같은 다른 환경변수는 메모리에서 값을 찾지 못했음.) 등록해주면 특정 메모리에 환경변수의 값이 올라간다. 파일경로를 이용한 쉘코드이므로 level8에서 사용했던 0x2f('/') 가 없는 쉘코드를 올려주면 된다.
정확히 확인한 주소로 올라가는 환경변수는 LD_PRELOAD.
LD_LIBRARY_PATH는 올라가지 않는 듯 하다.
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)); }
[ret] 을 제외한 버퍼의 모든 문자열 및 프로그램 시작시 주는 매개변수 환경변수등을 모두 0으로 덮는다.
그러므로 우리가 버퍼를 이용하여 조작할 수 있는 값은 [ret]뿐으로 보인다.
그렇다면 buffer, argv, env 와 같은 위치를 제외한 어딘가에 쉘코드가 올라가야 한다.
'LD_PRELOAD' 환경변수는 특정 라이브러리를 프로그램이 시작될 때 pre load 해주는 기능을 한다.
그래서 이 LD_PRELOAD 기능을 이용하여 원본 라이브러리 함수들을 hooking하기도 한다. 하지만 LD_PRELOAD 환경변수를 이용하여 실제 라이브러리가 등록되기 위해서는 실행중인 프로세스의 권한과 라이브러리의 권한이 서로 맞아야 한다. root 권한의 라이브러리라면 어떠한 프로그램에도 적용 될 것 같고, root가 아니라면 uid가 서로 같아야 할 것이다.
[skeleton@localhost test]$ cat program.c #include <stdio.h> int main() { printf("hello world!\n"); return 0; } [skeleton@localhost test]$ gcc -o program program.c [skeleton@localhost test]$ cat hook.c #include <stdlib.h> int printf(char *str) { puts("goodbye world!"); return 0; } [skeleton@localhost test]$ gcc -shared -fPIC -o hook.so hook.c [skeleton@localhost test]$ export LD_PRELOAD=./hook.so [skeleton@localhost test]$ ./program goodbye world! [skeleton@localhost test]$서론이 길었다.
결론은 LD_PRELOAD 환경변수에 등록된 라이브러리를 미리 로드하는 과정에서(실패를 했든 성공을 했든.) 메모리에 환경변수 값인 파일경로가 올라간다는 것이다. 나중에 level19에서도 알겠지만 이 파일경로가 올라가는 메모리 주소는 main함수가 시작되는 스택주소에서 -3000 정도 떨어진 곳에 size 3000 정도로 존재하는 것 같다.(이 위치 어딘가에 문자열이 존재한다.)
결론은 "LD_*" 관련 환경변수를 (라곤 하지만 LD_LIBRARY_PATH 와 같은 다른 환경변수는 메모리에서 값을 찾지 못했음.) 등록해주면 특정 메모리에 환경변수의 값이 올라간다. 파일경로를 이용한 쉘코드이므로 level8에서 사용했던 0x2f('/') 가 없는 쉘코드를 올려주면 된다.
정확히 확인한 주소로 올라가는 환경변수는 LD_PRELOAD.
LD_LIBRARY_PATH는 올라가지 않는 듯 하다.
댓글
댓글 쓰기