-
Array Operations보안개론 2024. 6. 4. 17:51
int val[5];
배열은 많은 경우 공격 대상이 됨
주소 크기는 시스템에 따라 다름
32비트 시스템에선 포인터 32비트 차지
64비트 시스템에선 포인터 64비트 차지 (실제론 48비트만 씀)
val[-3]
val[0]에서 -12바이트 전으로 가서 읽으려고 할 것
퍼미션이 있으면 접근 가능
typedef int zip_dig[5]; zip_dig cmu = {1, 5, 2, 1, 3}; zip_dig mit = {0, 2, 1, 3, 9}; zip_dig ucb = {9, 4, 7, 2, 0};
스택 보호 기법이 있는 경우, 32비트
-> 제일 먼저 선언된게 낮은 주소에 들어감
ucb [높은주소] .. {9, 4, 7, 2, 0} mit .. {0, 2, 1, 3, 9} cmu [닞은주소] ... {1, 5, 2, 1, 3} cmu[8] => 3
cmu[11] => 4
ucb[-5] => 0
ucb[-15] => 뭐가 나올 지 알 수 없음
cmu[12] => 7
mit[-5] => 1
mit[-4] => 5
mit[8] => 2
mit[9] => 0
*(cmu + 9) => 9
*(cmu + 11) => 4
*(mit - 4) => 5
*(ucb - 5) => 0
스택 보호 기법이 없는 경우, 32비트
cmu [높은주소] .. {1, 5, 2, 1, 3} mit .. {0, 2, 1, 3, 9} ucb [닞은주소] ... {9, 4, 7, 2, 0} 먼저 선언된게 높은 주소에 할당
mit[-5] => 9
mit[-4] => 4
mit[8] => 1
mit[9] => 3
스택 보호 기법이 있는 경우, 64비트
ucb [높은주소] .. {9, 4, 7, 2, 0, _, _, _} mit .. {0, 2, 1, 3, 9, _, _, _} cmu [닞은주소] ... {1, 5, 2, 1, 3, _, _, _} 32비트로 테스트할 땐 딱 맞아도, 64비트로 바꾸니 더미 공간이 생김
** 시스템마다 다를 수 있음
** 배열들의 시작 주소를 보면 더미 공간이 있는지 없는지 알 수 있음
#include <stdio.h> int main() { int k = 100; int a[4] = {0, 1, 2, 3}; int b[4] = {4, 5, 6, 7}; int c[4] = {8, 9, 10, 11}; a[-1] = 91; a[7] = 92; a[10] = 93; c[-2] = 101; c[-6] = 102; return 0; }
스택 보호 있음, 32비트
c {...} b {...} a {...} k k => 91 - (a[-1])
b[3] => 92 - (a[7])
c[2] => 93 - (a[10])
b[2] => 101 - (c[-2])
a[3] => 102 - (c[-6])
스택 보호 없음, 32비트
k a {...} b {...} c {...} b[-3] => 91 - (a[-1])
a[7], a[10], c[-2], c[-6] => 뭘 가리키는지 알 수 없음
'보안개론' 카테고리의 다른 글
취약한 언어 / SDLC / 범위를 벗어난 쓰기 / 완화 방법 등 (0) 2024.06.07 Byte Ordering, Simple Buffer Overflow (0) 2024.06.04 Integer Overflow, Underflow / Signedness bugs / Widthness bugs (0) 2024.06.04 Use After Free (0) 2024.06.03 bin, chunk, double free (0) 2024.06.03