마이크로소프트 사에서는 자주 사용하는 개발 IDE인 Visual Studio에서 scanf 사용을 권하지 않는다. 하위 버전에서는 경고를 띄우지만 최상위 버전에서는 SDL(security development lifecycle) 검사가 체킹 되어 있어 비주얼 스튜디오에서만 지원하는 scanf_s를 사용하지 않으면 오류가 뜨게 되어있다. scanf_s()는 문법은 scanf()와 다를게 거의 없다. 그러나 문자열을 입력받는 서식문자 %s를 사용할 땐, 저장할 문자열 뒤에 최대 문자열 입력 개수를 인자로 한 개 더 넣어주어야 한다. 1 2 char name[10]; scanf("%s", name); cs 이전 scanf 사용이 이랬었다면, 1 2 3 #define MAX_LEN 10 char name[MAX_LEN]; scanf_s("%s", name, MAX_LEN); cs scanf_s를 사용해야 할 때 이런 식으로 인자를 한 개 더 추가해 주어야 한다. 참고로 비주얼 스튜디오에서 scanf_s를 사용할 때 문자열 입력을 받는 때에 문자열 길이를 지정해 주지 않아도 문법 오류가 뜨지 않는데, 실행했을 때는 오류가 난다. 문법 오류가 나지 않아도 문법 오류이다. 이는 오묘한 문법때문인데, scanf_s를 이렇게 사용할 때의 케이스가 있기 때문이다. 1 2 3 4 5 #define MAX_LEN 10 char name[MAX_LEN]; int grade; int age; scanf_s("%s %d %d", name, MAX_LEN, &grade, &age); cs 문자열을 입력 받을 ...
스택을 다루는데 있어서 ESP 레지스터, 현재 스택을 가리켜 주는 ESP레지스터를 사용하는데 함수를 만들고 사용할 때 함수를 들어가서 ESP 레지스터를 막 사용하다 보면 원래 돌아가야 할 위치를 알고 있더라도 함수의 시작 위치를 알 수 없게 되고 사용이 굉장히 복잡해진다. 그걸 방지?하기 위해 스택 프레임 기법이라는 방식이 도입되었다고 하는데. 함수를 들어갔을 때의 스택의 위치를 EBP레지스터, 베이직 포인터 레지스터가 가지고 있고, 함수에서 스택을 다룰 때 ESP를 사용 후 나중에 EBP에서 함수의 첫 주소를 가지고 있게 하며 안전하게 리턴할 수 있게 한다. 리버싱 핵심원리에 있는 예제와 비슷하게 코딩해봤다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include < stdio.h > #include < stdio.h > int add( int num1, int num2); int main() { int a, b; a = 10 ; b = 20 ; int c; c = add(a, b); printf ( "%d\n" , c); } int add( int num1, int ...
댓글
댓글 쓰기