golem.c 를 열어봅시다.
눈씻고 봐도 페이로드를 올릴 곳이 보이지 않는다..
맨 아래 스택 파괴자 부분 때문에 golem이 LOB 문제 중에서도 악명 높다고 한다..
그냥 우리가 하던 방식으로는 불가능 한듯 하다.
이건 솔직히 잘 몰라서 검색을 한번 해보고 했다.
근데 검색해도 답이 없다. 공유 라이브러리를 이용??
그래서 공유라이브러리 부터 공부 다시함 ㅡㅡ;
결론적으로. 공유 라이브러리를 임의로 제작하여 그 이름으로 페이로드를 올리고
그걸 LD_PRELOAD 라는 환경변수에 정확한 경로를 지정해주면 프로그램이 등록한
공유 라이브러리 부터 링크 시키게 된다.
공유 라이브러리 영역에 제작한 라이브러리가 쌓이므로 그 곳에 페이로드가 올라간 셈이다.
이 원리를 이용해서 공격한다.
공유 라이브러리 영역은 아래 그림처럼 스택 아래에 있다.
그럼 이제 풀이를 해보자.
먼저 임의의 공유 라이브러리 파일을 만들기 위해 abc.c에 example() 이라는 텅텅빈 함수를 만들었다.
여기서!!! #include <stdio.h>를 해버리면 굉장히 골아프다;
표준 라이브러리를 불러 오도록 해버리면 우리가 만든 라이브러리가 공유 라이브러리 영역 어디에 위치한지
찾을 때 굉장히 곤욕스러울 것이다. ( 거기에다가 RET를 줄거니까.)
다음 gcc에 여러 옵션을 주어 공유 라이브러리 파일을 만든다. 이 때 이름에 nop 50개와 셸코드를 삽입 했다.
이유는 위에서 설명했다.
(위에 걸린 링크를 따라 들어가면 설명을 볼 수 있따.)
그 다음 export로 LD_PRELOAD 환경 변수에 제작한 공유 라이브러리를 등록한다.
위에서 말했듯이, 페이로드를 이름으로 했으므로 공유 라이브러리 영역에 페이로드가 올라가 있는 셈이다.
이제 이 위치를 찾아 RET를 그쪽으로 돌려주면 될 것이다.
공유 라이브러리 영역 주소대를 정확하게 몰라서 노가다 뛰었다.
ebp-5000 부터 엔터를 수십번 때리니까 아까 넣은 nop 부분이 나오는군..
이제 NOP sled 중 하나에 리턴 어드레스를 주면 셸이 올라오지 않을까 싶은데. 해봅시다.
'IT 그리고 정보보안 > Write-up' 카테고리의 다른 글
LOB Level 13 (darkknight) (0) | 2021.04.12 |
---|---|
LOB Level 12 (golem) (0) | 2021.04.12 |
LOB Level 10 (vampire) (0) | 2021.04.12 |
LOB Level 9 (troll) (0) | 2021.04.12 |
LOB Level 8 (orge) (0) | 2021.04.12 |