일부러 오버플로우 시켜 보았습니다.
#include<iostream> using namespace std; int main(){ int* ax; ax = new int[10]; ax[11] = 123; cout << ax[11] << endl; return 0; }
g++과 VC++에서 돌려보았는데, 런타임 오류가 일어나지 않습니다.
원래 이런건가요?
C/C++ 은 배열 사이즈 검사 안해주는데요 그냥 할당합니다.
바로 그 침범당한 메모리를 사용하지 않는 이상 에러 안날땐데요
그래서 그것을 악용한 공격들이 많지요~
JAVA 나 .NET 은 검사해줍니다.
당연한 결과라고 생각합니다. 컴파일러에서 buffer 관련 체크 옵션을 준다고 해도, 잘 잡아주지 못하는 것으로 압니다.
실제 문제가 발생되는 시점은, 이렇게 오염된 이후에 실제 [10]~ 이후의 영역을 사용하고 있던 녀석을 사용하려고 할 때 발생하겠죠. 그것도 런타임 오류라기 보다는 로지컬한 오류로...
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
C/C++ 은 배열 사이즈 검사 안해주는데요
C/C++ 은 배열 사이즈 검사 안해주는데요 그냥 할당합니다.
바로 그 침범당한 메모리를 사용하지 않는 이상 에러 안날땐데요
그래서 그것을 악용한 공격들이 많지요~
JAVA 나 .NET 은 검사해줍니다.
당연한 결과라고
당연한 결과라고 생각합니다.
컴파일러에서 buffer 관련 체크 옵션을 준다고 해도, 잘 잡아주지 못하는 것으로 압니다.
실제 문제가 발생되는 시점은, 이렇게 오염된 이후에 실제 [10]~ 이후의 영역을 사용하고 있던 녀석을 사용하려고 할 때 발생하겠죠.
그것도 런타임 오류라기 보다는 로지컬한 오류로...
댓글 달기