문제확인
이번 문제도 level11과 비슷한 문제로 풀 수가 있다. 일단 tmp로 파일을 복사하여 디버깅을 해보자.
이전 문제와 같이 0x108 만큼의 버퍼를 채우고 RET에 새로운 주소값을 채우면 된다.
EGG Shell을 이용한 방법
Egg쉘을 이용한 방법의 경우 아래와 같이 쉽다.
Shell Code = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
getaddr.c
#include <stdio.h>
main(){
char *p=getenv("EGG");
printf("Address : %p\n",p);}
RTL ( Return to Libc)을 이용한 방법
RTL은 리턴 주소를 공유 라이브러리 함수의 주소로 적어 해당 함수를 실행시키는 방법이다. 스택의 구조에서 system()함수를 ret에 덮어 씀으로 인하여 프로세스가 종료되고 리턴할 때 system()함수로 가게 된다. 그리고 system()함수가 끝나게 되면 그 다음 4바이트가 리턴주소이기 떄문에 정상적으로 종료될 수 있게 하기 위하여 exit()를 붙여준다.
system()는 쉘을 실행할수가 있고 인자로 /bin/sh를 넣어주면 된다.
결국 ----str[256]-dummy[8]-SFP[4]-RET[4] >>> ---A[256]-A[8]-A[4]-System()[4]-exit()[4]-"/bin/sh"[4]로 덮어준다고 볼 수 있다.
아래에는 system() 의 안에 있는 /bin/sh 문자열의 주소를 구하는 코드이다.
Cat을 붙이는 이유
Pipe( | ) 사용시 왼쪽 프로그램의 stdout이 오른쪽 프로그램의 stdin으로 들어가게 되는데 python 이 실행되고 종료되면서 pipe broken 오류로 인하여 종료가 일어난다 따라서 사용자의 입력을 출력해주는 cat이나 te를 이용하여 stdin을 유지 시켜야한다.
<분명히 캡쳐를 한 것인데, 출처를 잊어버렸..>
BackDoor 생성
위의 방법들을 통하여 쉘을 얻은 후에 추가적으로 입력을 해주면 아래와 같이 Backdoor를 생성 할 수가 있다.
참고
http://smleenull.tistory.com/276 //RTL
http://peonix120.tistory.com/3 //RTL
'Hacking > System Hacking' 카테고리의 다른 글
FTZ Level15 //Hard Coding, EGG (2) | 2015.05.21 |
---|---|
FTZ Level14 //Distance (0) | 2015.05.17 |
FTZ Level13 //RTL, EGG (0) | 2015.05.13 |
FTZ Level11 //BOF,EGG,Format String (0) | 2015.05.09 |
#25 Bytes Shell Code (0) | 2015.05.07 |