[LOB] darkknight -> bugbear
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 | /* The Lord of the BOF : The Fellowship of the BOF - bugbear - RTL1 */ #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] == '\xbf') { printf("stack betrayed you!!\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } | cs |
bugbear의 소스이다 . 힌트를 보면 알 수 있듯이 이번엔 RTL 기법을 사용해서 풀어야 한다. ret에 스택내의 주소를 덮으려하면 스택이 배신했다고 하면서 종료돼버린다.
RTL(Return To Libc) : 스택에서 어떤 코드도 실행되지 못하도록 하는 보호기법이 나온 이후 나온 기법. 프로그램이 실행될 때 프로그램이 사용한 함수를 포함한 내장라이브러리인 Libc가 Libc 영역에 적재된다. 이 라이브러리에는 system()함수도 포함되어있는데 프로그램이 이함수를 쓰지 않더라도 LIbc가 통째로 올라가기 때문에 메모리에 같이 적재된다
*system()함수 : 명령어를 실행하는 함수.
이제 메모리 적재되어있는 Libc 영역에서 system() 함수의 주소를 찾고 인자로 "/bin/sh"를 주면 다음레벨의 쉘을 딸 수 있을것이다.
system()함수의 주소는0x40058ae0이다.
이제 "/bin/sh"문자열이 있는 주소를 전달하면 되는데 환경변수를 /bin/sh로 등록해도되지만 system() 함수 내에서도 /bin/sh라는 문자열이 존재한다.
1 2 3 4 5 6 7 8 9 10 | int main(int argc, char * argv[]) { long shell; shell = 0x40058ae0; //system 함수 주소 while(memcmp((void *)shell, "/bin/sh", 8)) //시스템 함수 내에서 /bin/sh문자열 비교 shell++; printf("/bin/sh = %p\n",shell); // /bin/sh문자열이 있는 } | cs |
위 소스로 "/bin/sh" 문자열이 있는 주소를 찾을 수 있다.
주소는 0x400fbff9
프로그램의 ret주소를 system()함수의 주소로 채우고 뒤에 인자를 전달하는데, ret명령에 의해 호출된 system() 함수는 ret가 쌓이지 않기 때문에 비어있는 ret자리인 4byte를 더미로 채우고 인자(/bin/sh의 주소)를 전달한다
페이로드와 Password
'System > LOB' 카테고리의 다른 글
[LOB] giant -> assassin (0) | 2015.04.14 |
---|---|
[LOB] bugbear -> giant (2) | 2015.04.14 |
[LOB] golem -> darkknight (0) | 2015.04.11 |
함수의 프롤로그(prologue) 및 에필로그(epilogue) (0) | 2015.04.10 |
[LOB] skeleton -> golem (0) | 2015.04.07 |