오늘은 Return To Library(RTL)에 대해서 알아 볼 것이다.
문제는 해커스쿨의 FTZ를 이용하겠다.
리턴 값을 라이브러리가 있는 곳으로 바꿔버린다는 뜻이다.즉 우리가 실행시키고 싶은 라이브러리 주소를 리턴값으로 넘기는 것이다.
DAY-5에서는 쉘코드를 이용해서 흐름을 바꿧는데 뭐하러 쉘코드를 사용하지 않는지 의문이 들 것 이다.
이런 방법은 옛날 부터 막혀있다.스택이 일정치 않아서 찾기도 힘들뿐만 아니라 스택에서도 코드실행을 막는다고 한다.
그래서 RTL을 이용해서 쉘을 실행시켜 보겠다.
일단 RTL을 해보기 전 이론먼저 훑어 보겠다.
{
[낮은 주소값 = 높은주소] ` [높은 주소값 = 낮은주소]
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA BBBB system "/bin/sh"
[buffer] [saved ebp] [saved eip] [return값] [인자]
문제 소스코드.
첫번째 방법.
일단 gdb로 attackme를 까본다
깐 후에 몇 개의 공간을 넣어야지 ebp를 침범할 수 있는지 알아 보자.(DAY-3 참조)
.
.
.
268개의 공간을 넣으면 saved ebp까지차서 eip로 원하는 함수를 실행 시킬수 있을 것이다.
saved eip에 원하는 함수를 넣어도 인자가 없으면 말짱 도로묵이다.
일단 라이브러리에 /bin/sh가 있는지 찾아보자.
gdb에서 info proc mappings를 사용하면 라이브러리가 어느공간을 차지하는지 볼 수 있다.
일단 시작주소는 알았다.
시작 주소를 알아보는 이유는 FTZ에서 파이썬이 실행되니 라이브러리를 열어서 /bin/sh문장을 찾아볼 것 이다.
그럼 /bin/sh문장이 몇번째 줄에 있는지 알 수 있게된다.그러면 시작주소에서 몇번째 줄에 있는지를 더하면
/bin/sh의 주소가 나올 것 이다.
1232164번째줄에 있다.
더해서 hex값으로 바꿔주면 0x4014AD24이 나온다.
한번 확인해 보자.
정확하게 /bin/sh이 들어있다.
그럼 이제 답만입력하면 끝난다.
성공적으로 쉘이 들어갔다.
두번째 방법.
두번째 방법에서는 /bin/sh의 주소를 구하는 것 빼고는 모두 동일하다.
라이브러리에 있는 문자열을 구해 파일을 만들어 그파일을 /bin/sh에 심볼릭 링크를 걸으면 /bin/sh의 주소값이 더욱 빠르게 구해질 것 이다.
일단 attackme에 쓸만한 문자열이 있는지 확인을 위해 0x8048000인 처음주소부터 확인해 보겠다.
확인을 하다보니 GNU라는 문자열이 보인다.
이문자열을 이용해서 심볼릭링크를 걸겠다.
걸린 모습을 볼 수 있다.
하지만 이렇게만 하면 파일을 실행할 때 GNU라는 문자열을 만나도 그냥 문자열로만 인식할 것 이다..
그이유는 GNU가 만들어져 있지만 GNU를 환경변수에 올려 놓지 않아서 그렇다.
환경변수에 올려줘야 한다.
export PATH=/home/level11/tmp:$PATH
//PATH문장 뒤에 있는 주소에 들어있는 주소의 명령어만 실행이 된다.
//그래서 /home/level11/tmp를 해주면 tmp안에 있는 명령어를 실행시킬 수 있다.
//$PATH를 붙이는 이유는 원래있던 문자열을 이어붙이기 위해서이다.
올라간것을 확인 할 수 있다.
그럼 GNU문자열의 주소를 인자로 넣어주면 /bin/sh이 들어갈 것이다.
시스템 함수의 인자로 /bin/sh을 넘겨서 쉘을 따내었다.
'SYSTEM HACKING > 기법' 카테고리의 다른 글
DAY-7 ROP(Return Oriented Programming) (0) | 2017.11.18 |
---|---|
Special Chapter-RTL Chaining (0) | 2017.11.11 |
DAY-5 쉘코드 작성 (0) | 2017.11.10 |
DAY-4 프로세스 디버깅 (0) | 2017.11.02 |
DAY-3 버퍼오버플로우를 풀어보자 (0) | 2017.10.23 |