11번 문제부터는 BOF 문제들이 많다.
하나하나 해결해 나가보자.
<Hint>
소스를 실행하면 3092 권한을 가지고 문자열을 str에 복사한 후 출력하는 내용이다.
여기서 자세히 봐야 하는 부분은 !!
strcpy(str, argv[1]);
이 부분이다. strncpy() 함수와는 다르게 ! strcpy는 어느정도 크기를 복사해야 할지
명시되어 있지 않다. 복사해야 될 문자열의 크기만큼 복사하게 된다.
그렇게 되면 str변수보다 argv[1]의 크기가 더 크더라도, str 배열의 크기를 넘어서
복사된다.
다른 메모리를 침범하게 되는 것이다.
이 부분을 이용하여 문제를 푼다.
정말 단순한 BOF 문제이다.
3092를 확인해 보면 level12의 id임을 확인할 수 있다.
그럼 실행파일를 gdb를 이용하여 분석을 시작해보자.
위에서 메모리에 256Byte만 선언하지만, gcc 버전이 2.96버전이므로,
dummy 데이터가 존재한다.
그래서 256 + dummy = 264 byte이다.
dummu 데이터가 있기 때문에 스택 영역을 확인하면서 메모리가 저장되는
주소를 확인해야 한다.
기본적으로 필요한 메모리 할당하고 dummy데이터 영역이 존재하게 되므로
아래와 같은 구조가 된다.
스택 영역의 낮은 주소부터 메모리영역이 구성된다.
그럼 여기서 어떻게 공격을 하느냐?
위에 영역에서 보면 RET라는 함수가 리턴되는 주소가 저장되는 영역이 있다.
BOF 공격시 256 Byte를 넘어 RET까지 덮어쓰는 방식을 사용해서
내가 원하는 곳의 메모리 시작주소로 덮어씌우는 방식으로 공격한다.
만약 그 주소영역에 쉘을 실행시키는 코드가 들어있다면?
level12의 권한을 가지고 쉘이 실행되므로,
쉽게 문제를 해결할 수 있을 것이다.
이제 스택영역을 분석해보자.
A를 264개 B를 4개 C를 4개를 입력해서 RET의 메모리 주소는 0xbffff9bc
그럼 환경변수나 쉘코드를 이용한 공격을 할 수 있다.
인터넷에 보면 많은 쉘코드 들이 존재한다.
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"
이 코드를 이용해서 공격하겠다.
저 쉘코드를 환경변수에 등록해서 공격하는 방식은 나중에 설명하기로 하고,
여기서는 입력값에 쉘코드를 넣어서 공격한다.
쉘 코드를 삽입하고 나머지 코드에는 nop를, 그리고 RET 메모리 영역에는
시작되는 메모리 주소를 입력하여 공격한다.!
그럼 쉘이 실행됨을 알 수 있다.
이걸로 해결 !
'ETC > Security' 카테고리의 다른 글
[정보보호개론] 정보보안의 3가지 속성 (0) | 2018.11.04 |
---|---|
Level 12 (0) | 2013.11.21 |
Level 10 - Share Memory(공유 메모리) (0) | 2013.11.04 |
Level 9 (0) | 2013.10.31 |
Level 8 (0) | 2013.10.31 |