일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- C++
- gui
- C++ library
- JUCE 튜토리얼
- OS
- go channel
- 공룡책
- tour of go
- C++ gui
- C++ gui 라이브러리
- JUCE library
- JUCE
- a tour of go
- C언어
- c++ heap
- go
- Nebula
- 프로그래밍
- LOB
- 운영체제
- 리듬게임
- 연결리스트
- 자료구조
- JUCE라이브러리
- 코딩
- vim-go
- Docker
- 알고리즘
- 백준
- BOJ
- Today
- Total
CafeM0ca
[LOB]level15 assassin 본문
ID:assassin
PW:pushing me away
이전 문제에서 strcpy대신 strncpy를 사용한다. ret뒤로 페이로드를 구성 못하게할 셈.
FakeEBP를 이용해서 풀어야한다.
FakeEbp: leave,ret가젯을 이용하여 eip를 컨트롤한다.
leave,ret명령어를 열어보면 //leave,ret을 에필로그라 함
leave : mov esp ebp //esp를 ebp로 옮기고
pop ebp //스택 최상단(esp)에서 4byte를 빼고 ebp에 저장한다. pop되니까 당연히 esp값은 +4된다. (스택은 거꾸로 자란다.)
ret : pop eip //스택 최상단에서 4byte를 빼고 eip는 스택 최상단을 가리킨다.
jmp eip //eip가 가리키는 곳을 실행
return 값으로 leave,ret가젯을 주게 되면 leave,ret이 2번 실행되는데
처음 leave에서 esp는 sfp를 가리키게 되고 ebp는 sfp-4값을 가리킨다.
처음 ret에서 eip는 leave,ret가젯을 가리키게 된다.
sfp-4값을 버퍼의 주소로 둬보자.
두번째 leave에서 esp는 ebp(버퍼의 주소)를 가리키고 ebp는 버퍼의 주소-4를 가리킨다.
두번째 ret에서 eip는 ebp+4(버퍼의 주소)를 가리키게 된다.
버퍼의 주소가 쉘코드를 가리키면 exploit에 성공하게되는 원리다.
사진에서 첫번째 에필로그가 진행된 후 esp는 sfp+4를 가리키고있고 ebp는 버퍼의 시작점을 가리키고 있다.
두번째 에필로그에서 leave명령이 진행되면 esp는 ebp(0xbffffc54)을 가리키게되고 ebp는 buffer(쉘코드)-4를 가리키게 된다. leave명령이 끝난 후 eip는 쉘코드를 가리키는데 eip가 쉘코드 주소를 가리키게 하기위해 첫번째 에필로그에서 ebp가 버퍼의 시작점-4부분을 가리키게하면 된다. 그리고 buffer의 시작점을 쉘코드 주소로 바꾸면 eip -> buffer -> shellcode가 된다. 따라서 쉘이 실행된다.
exploit
'Hacking > LOB(Red Hat)' 카테고리의 다른 글
[LOB]level17 succubus (0) | 2018.01.20 |
---|---|
[LOB]level16 zombie_assassin (0) | 2018.01.19 |
[LOB]level14 giant (0) | 2018.01.18 |
[LOB]level13 bugbear (0) | 2018.01.17 |
[LOB]level12 darkknight (0) | 2018.01.04 |