사실 스택 영역을 이용해야 해서 나는 방법을 못찾아서 검색해보았다.
리눅스 공유라이브러리와 LD_PRELOAD 환경변수에 대한 지식이 있어야만 풀 수 있는 문제였다.
LD_PRELOAD는 프로세스 실행 과정 중 LD_PRELOAD 환경변수에 라이브러리가 설정되어 있을 시에 해당 라이브러리를 먼저 로딩하는 역할을 한다.
근데, 이 라이브러리 파일명이 스택 영역에 올라간다고 한다!!
그렇다면..전 문제와 똑같이 하면 되겠지?
일단 라이브러리 파일을 만든다.
대충 lib.c로 만들었다.
![](https://t1.daumcdn.net/cfile/tistory/99C3AB4D5C93119D12)
그리고 리눅스 라이브러리 파일의 확장자는 .so인데, 이 so 파일을 컴파일하려면 컴파일 옵션에서 -shared를 설정해야 한다.
또한 -fPIC는 so파일 속도 개션을 위한 옵션으로, 보통 둘이 같이 사용된다고 한다.
LD_PRELOAD가 설정되지 않았던 것을 확인하고, 만든 라이브러리 절대 경로를 LD_PRELOAD 변수의 값으로 설정한다.
![](https://t1.daumcdn.net/cfile/tistory/994CF54D5C93119E17)
그리고 진짜 아무 파일이나 실행했을 때 저 라이브러리가 실행되는지 확인해보았다.
ldd 명령어는 파일이 실행될 시에 사용되는 공유 라이브러리를 확인하는 명령어이다.
![](https://t1.daumcdn.net/cfile/tistory/995A104D5C93119E16)
그럼 메모리에 라이브러리 파일 이름이 올라가나 확인해보았는데, 뭐 다 그렇듯 메모리 뒤지는 건 다 노가다이다.
일단 브레이크포인트를 걸고,
![](https://t1.daumcdn.net/cfile/tistory/9928BA4D5C93119E0E)
여기 하나 있지만, 아마 환경변수를 보여주는 메모리 부분이여서 golem을 풀 때와는 상관없는 부분이다.
![](https://t1.daumcdn.net/cfile/tistory/999FF14D5C93119F0A)
그런데, 하나 더 찾았다. 0xbffff6cf 부분에 있었다.
![](https://t1.daumcdn.net/cfile/tistory/99C4F4435C93119F11)
음 그러면 이제 라이브러리 이름을 쉘코드로 바꾸고, LD_PRELOAD를 unset하고, 다시 쉘 코드로 바뀐 라이브러리를 export 해준다.
![](https://t1.daumcdn.net/cfile/tistory/9903C4435C9311A00E)
![](https://t1.daumcdn.net/cfile/tistory/99DEA6435C9311A003)
![](https://t1.daumcdn.net/cfile/tistory/992A74435C9311A00B)
unset하고 다시 export하기도 했고, 이름길이도 바뀌었으니 다시 메모리 영역 어디에 쉘코드가 올라갔는지 확인해야 한다.
따라서 ovo를 golem의 심볼릭 링크로 만들려고 하는데, 원래 있는 파일이면 -f를 붙이면 된다고 한다.
![](https://t1.daumcdn.net/cfile/tistory/99EB96435C9311A10F)
![](https://t1.daumcdn.net/cfile/tistory/99D651435C9311A210)
그리고 다시 gdb해주었더니 0xbffff4ef 부분에 존재함을 알 수 있었다.
대충 앞부분을 NOP으로 채웠으니, 0xbffff4ff를 리턴 어드레스로 하면 될 것 같다.
![](https://t1.daumcdn.net/cfile/tistory/99C6A4435C9311A111)
성공
![](https://t1.daumcdn.net/cfile/tistory/997C64505C9311A30C)