일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 30 |
Tags
- 리듬게임
- 알고리즘
- C++
- OS
- 프로그래밍
- a tour of go
- LOB
- Nebula
- go channel
- 자료구조
- JUCE라이브러리
- JUCE
- c++ heap
- 코딩
- 백준
- C언어
- 운영체제
- gui
- go
- 연결리스트
- BOJ
- vim-go
- JUCE 튜토리얼
- Docker
- JUCE library
- C++ library
- 공룡책
- C++ gui
- C++ gui 라이브러리
- tour of go
Archives
- Today
- Total
CafeM0ca
[LOB]level10 skeleton 본문
반응형
입장ID:skeleton
입장PW:shellcoder
조건을 보면 argv[1][47]은 \xbf 이어야하고 스택은 사용하지 못한다.
그럼 스택이 아닌 부분을 사용해야 하는데 이 문제는 공유라이브러리를 사용해야한다.
공유 라이브러리는 printf나 strcpy와 같은 함수들이 있는 공간이다.
리눅스에는 LD_PRELOAD라는 환경변수가 존재한다. 이 환경변수는 등록한 공유라이브러리를 우선시 한다.
예를 들면 위 사진의 코드중 printf는 공유라이브러리에 존재한다. 하지만 사용자가 임의의 printf함수를 만들고 공유라이브러리로 컴파일하여 LD_PRELOAD로 올리면 기존의 printf가 아닌 사용자가 만든 printf가 작동한다.(후킹)
그럼, 방금 말한 시나리오대로 간편하게 "쉘을 실행시키는 printf 함수를 만들어버리고 후킹해버리면 되지 않을까?" 라고 생각해봤지만 setuid가 걸린 파일에는 적용이 안된다. 따라서 메모리상에 쉘코드를 올려주고 그 주소로 eip를 조작해야한다.
우선 쉘코드를 공유라이브러리에 올려주자. 아무 파일이나 쉘코드를 공유라이브러리로 컴파일해주자.
주의할 점은 쉘코드가 파일명이어야함으로 심볼릭링크 쉘코드를 사용한다.
환경변수에 올려주고
ebp-3000쯤부터 찾으면 잘 메모리에 로드된걸 확인 할 수 있다.
payload
./golem `python -c 'print "A"*44+"\x64\xf7\xff\xbf"'`
다음ID:golem
다음PW:cup of coffee
반응형
'Hacking > LOB(Red Hat)' 카테고리의 다른 글
[LOB]level12 darkknight (0) | 2018.01.04 |
---|---|
[LOB]level11 golem (0) | 2018.01.04 |
level9 vampire (0) | 2017.09.14 |
level8 troll (0) | 2017.09.14 |
level7 orge (0) | 2017.09.14 |
Comments