c언어 구조체 오버플로우 관련 질문 드립니다.
글쓴이: 익명 사용자 / 작성시간: 목, 2018/03/15 - 2:03오후
#include <stdio.h>
typedef struct{
char a;
char b;
char c;
char d;
}abc;
typedef struct {
char k[2];
}b;
void main()
{
int i=0;
abc a1;
b *b1;
a1.a='a';
a1.b='b';
a1.c='c';
a1.d='d';
b1=(b*)&a1;
printf("%c\n",b1->k[2]);
for(i=0;i<6;i++){
printf("%c\n",b1->k[i]);
}
printf("%d\n",sizeof(*b1));
printf("%d",sizeof(a1));
}여기서 구조체 b의 크기는 2바이트이고 문자 역시 2바이트만 담길수 있게끔 조작했습니다
그런데 출력은 abcd가 전부 출력되어집니다 원래는 오버플로우가 나야 하지 않나요?
Forums:

오버플로 발생합니다.[schoi0@SEL-SCHOI0
오버플로 발생합니다.
[schoi0@SEL-SCHOI0-D2 net]$ cat ovf.c #include <stdio.h> #define _no_optimize_ volatile int main(void) { _no_optimize_ int array_1[3] = {0,1,2}; _no_optimize_ int array_2[3] = {3,4,5}; _no_optimize_ int array_3[3] = {6,7,8}; printf("%d %d %d\n", array_1[1], array_2[1], array_3[1]); array_2[4] = 100; printf("%d %d %d\n", array_1[1], array_2[1], array_3[1]); return 0; } [schoi0@SEL-SCHOI0-D2 net]$ [schoi0@SEL-SCHOI0-D2 net]$ gcc -o ovf ovf.c [schoi0@SEL-SCHOI0-D2 net]$ [schoi0@SEL-SCHOI0-D2 net]$ ./ovf 1 4 7 100 4 7설령, 출력 결과물이 바뀌지 않는다해도 오버플로는 발생하고 있습니다. 단지 인지하지 못하고 있는 것 뿐이고요.
이런 메모리 경계 침범 사고가 발생하면 전혀 뜬금없는 곳에서 프로그램이 죽기 때문에 누가 어디서 사고를 쳤는지 알아내기가 힘들고요.
음 ..
어떤 오버플로우를 기대하신건지..?
단순히 허용되지 않은 주소의 값을 읽어 내는 것은 오버플로우라고 부르지 않습니다.
b1->k[2] 는 k[] 의 인덱스 범위를 초과해서 접근했지만..
다행히도 a1 의 메모리 범위 내에 있기 때문에 문제는 일어나지 않았고..
for loop 에서는 a1 의 범위를 초과해서 정의되지 않은 메모리 주소에 접근했는데..
프로그램이 간단하고 운이 좋아 문제가 발생하지 않았을 뿐입니다.
혹시 b1->k[4] 와 b1->k[5] 에서 a1 의 다음 변수인 b1 의 내용이 찍히지 않을까 생각하신거라면..
변수들이 어떻게 배치될지는 컴파일러나 버퍼 오버플로우 프로텍션과 같은 기능에 따라 다르기 때문에 어떻게 될지 알 수 없습니다.
a1 와 b1 의 주소값을 찍어 보면, 그 차이가 sizeof(a1) 보다는 크게 나올겁니다.
다른 타입의 포인터로 캐스팅 해서 쓰는 경우에는..
내가 접근할 수 있는 메모리가 어디까지인지 정확하게 계산하고..
그 범위를 벗어나지 않도록 해야 합니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
댓글 달기