PWN buf
http://pwnable.kr/index.php
일단 writeup에 나온 나온 다운로드 주소를 firefox로 가서 입력한다. 그러면 파일을 다운받겠냐는 물음이 뜨는데 이걸 저장한 후 터미널에서 열어 확인해 보면 된다. 파일은 buf라는 c언어 파일인데 어떤 프로그램인지 확인하기 위해 열었다.
일단 mian함수에서는 func라는 함수를 실행하고 끝낸다. 그럼 func라는 함수를 살펴보자.
일단 인자로 int형인 key라는 값을 가져온다.
overflowme라는 문자열을 입력받는다.
key값이 0xcafebabe라면 성공이고 그렇지 않으면 실패하게 된다.
여기서 의문인 점은 입력은 overflowme라는 문자열을 받았으면서 왜 성공의 조건은 함수의 인자로 받는 key값을 통해 결정하는냐 이다. 이것은 버퍼 오버플로우를 통해 해결할 수 있다. 버퍼 오버플로우란 메모리에서 생기는 오류 중 한 종류로 프로그램 안에서 한 데이터가 버퍼에 저장될때 지정한 용량보다 많은 메모리를 차지하게 되면서 인접 메모리까지 덮어쓰게 된다.
위 프로그램에서 확인할 수 있듯이 main함수에서 key 값은 이미 프로그램 돼있다. 여기에서 사용자가 입력할 수 있는 것은 overflowme라는 문자열 하나이기 때문에 이 문자열을 적당히 넘치게 만들어 key값이 있는 메모리에 원하는 값을 넣으면 된다.
일단 bof.c라는 프로그램이 어떻게 메모리를 활용하고 있는지 알아보기 위해서 gdb를 썼다. gdb는 리눅스에서 사용할 수 있는 디버거이다.
시스템 스택에서는 주소가 높은 곳부터 낮은 곳으로 채워진다. 처음 스택세 push ebp를 하면서 시작하는데 이는 처음 함수를 불러오는 것을 말한다. 여기서 중요한 것은 overflowme와 key가 얼마나 떨어져 있는지를 알아내는 것이다. <+29>를 보면 overflowme 배열이 시작하는 위치가 ebp-0x2c라는 것과 <+40>부분에서 key 값이 ebp+0x8에 저장되어있다는 것을 알 수 있다. 이 둘 사이의 값은 0x8+0x2c = 0x34이다. 10진수로 변환해주면 52이니까 이 둘사이의 거리가 52만큼 떨어져 있어서 만약 overflowme에 52 카이트 이상의 데이터가 들어간다면 53 바이트부터는 key라는 변수에 저장이 된다.
그러면 이제 overflowme에 52 바이트를 넣고 그 이후에 들어가는 값이 0xcafebabe라면 key에 알맞는 수가 들어가 성공하게 된다.
python을 통해 입력해주는데 한 문자를 *52해주고 그 뒤로는 key값을 넣어준다. (리틀 인디안 방식이어서 뒤부터 2자리씩 끊어 넣어줘야 한다. ) 그리고 파이프를 통해 nc pwnable.kr 9000으로 들어가 cat flag를 통해 flag를 확인해주면 성공!!
참고:
https://ko.wikipedia.org/wiki/%EB%B2%84%ED%8D%BC_%EC%98%A4%EB%B2%84%ED%94%8C%EB%A1%9C
http://air802.tistory.com/122
http://noisivohees.tistory.com/11
http://pwnable.kr/index.php
일단 writeup에 나온 나온 다운로드 주소를 firefox로 가서 입력한다. 그러면 파일을 다운받겠냐는 물음이 뜨는데 이걸 저장한 후 터미널에서 열어 확인해 보면 된다. 파일은 buf라는 c언어 파일인데 어떤 프로그램인지 확인하기 위해 열었다.
일단 mian함수에서는 func라는 함수를 실행하고 끝낸다. 그럼 func라는 함수를 살펴보자.
일단 인자로 int형인 key라는 값을 가져온다.
overflowme라는 문자열을 입력받는다.
key값이 0xcafebabe라면 성공이고 그렇지 않으면 실패하게 된다.
여기서 의문인 점은 입력은 overflowme라는 문자열을 받았으면서 왜 성공의 조건은 함수의 인자로 받는 key값을 통해 결정하는냐 이다. 이것은 버퍼 오버플로우를 통해 해결할 수 있다. 버퍼 오버플로우란 메모리에서 생기는 오류 중 한 종류로 프로그램 안에서 한 데이터가 버퍼에 저장될때 지정한 용량보다 많은 메모리를 차지하게 되면서 인접 메모리까지 덮어쓰게 된다.
위 프로그램에서 확인할 수 있듯이 main함수에서 key 값은 이미 프로그램 돼있다. 여기에서 사용자가 입력할 수 있는 것은 overflowme라는 문자열 하나이기 때문에 이 문자열을 적당히 넘치게 만들어 key값이 있는 메모리에 원하는 값을 넣으면 된다.
일단 bof.c라는 프로그램이 어떻게 메모리를 활용하고 있는지 알아보기 위해서 gdb를 썼다. gdb는 리눅스에서 사용할 수 있는 디버거이다.
시스템 스택에서는 주소가 높은 곳부터 낮은 곳으로 채워진다. 처음 스택세 push ebp를 하면서 시작하는데 이는 처음 함수를 불러오는 것을 말한다. 여기서 중요한 것은 overflowme와 key가 얼마나 떨어져 있는지를 알아내는 것이다. <+29>를 보면 overflowme 배열이 시작하는 위치가 ebp-0x2c라는 것과 <+40>부분에서 key 값이 ebp+0x8에 저장되어있다는 것을 알 수 있다. 이 둘 사이의 값은 0x8+0x2c = 0x34이다. 10진수로 변환해주면 52이니까 이 둘사이의 거리가 52만큼 떨어져 있어서 만약 overflowme에 52 카이트 이상의 데이터가 들어간다면 53 바이트부터는 key라는 변수에 저장이 된다.
그러면 이제 overflowme에 52 바이트를 넣고 그 이후에 들어가는 값이 0xcafebabe라면 key에 알맞는 수가 들어가 성공하게 된다.
python을 통해 입력해주는데 한 문자를 *52해주고 그 뒤로는 key값을 넣어준다. (리틀 인디안 방식이어서 뒤부터 2자리씩 끊어 넣어줘야 한다. ) 그리고 파이프를 통해 nc pwnable.kr 9000으로 들어가 cat flag를 통해 flag를 확인해주면 성공!!
참고:
https://ko.wikipedia.org/wiki/%EB%B2%84%ED%8D%BC_%EC%98%A4%EB%B2%84%ED%94%8C%EB%A1%9C
http://air802.tistory.com/122
http://noisivohees.tistory.com/11
댓글
댓글 쓰기