LEVEL 13: RTL1
ret 자리에 0xbf로 시작하는 주소 즉, 스택의 주소를 넣을 수 없다.
그래서 RTL이라는 키워드를 주었다.
RTL은 Return To Libc의 준말로, 스택에서의 코드 실행 방지 기술(NX)을 우회하는 기법이다.
공유 라이브러리의 함수들을 이용해 공격하는 방법이다. 주로 system이나 exec** 계열 함수 등을 이용한다.
system 함수의 주소를 알아보자.
0x40058ae0에 위치하고 있다.
환경변수로 /bin/sh를 주고, 주소를 찾아도 되겠지만, system 함수가 사실 내부에서 /bin/sh을 이용하기 때문에,
공유 라이브러리 영역에 있을 수 밖에 없다.
그래서 아래와 같이 "/bin/sh"의 주소를 찾기 위한 코드를 작성한다.
0x400fbff9에 있나 보다.
buffer+sfp의 44바이트는 dummy, ret을 system 함수 주소,
그 다음 system의 ret 4바이트를 dummy, 그 다음은 "/bin/sh"의 주소로
payload를 작성하면 쉘을 얻을 수 있다.
하지만 종료 시, system 함수 주소와 "/bin/sh" 주소 사이에 들어간 dummy 값을 실행할 수 없어, 세그폴트가 발생한다.
깔끔한 마무리를 위해 exit 함수의 주소를 찾아 삽입해주자.
exit 함수는 0x400391e0에 있다고 확인된다.
A 4개 대신 저 주소를 넣어주면, 깔끔하게 종료된다.
'[Wargame Write-up] > Lord of Buffer Overflow' 카테고리의 다른 글
| [LoB RedHat 6.2] LEVEL 15: giant -> assassin (0) | 2016.10.19 |
|---|---|
| [LoB RedHat 6.2] LEVEL 14: bugbear -> giant (0) | 2016.10.19 |
| [LoB RedHat 6.2] LEVEL 12: golem -> darkknight (0) | 2016.10.19 |
| [LoB RedHat 6.2] LEVEL 11: skeleton -> golem (0) | 2016.10.18 |
| [LoB RedHat 6.2] LEVEL 10: vampire -> skeleton (0) | 2016.10.18 |