마이크로소프트 사에서는 자주 사용하는 개발 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 문자열을 입력 받을 ...
리버싱 핵심원리(소위 나뭇잎책)에서의 레나 리버스미 문제 풀이를 책을 따라가 보며 풀어보았다. 분석은 책에서 쓰인 올리디버거를 사용하였다. Tut.ReverseMe1 문제는 처음에 Nag Screen이라는 박스가 뜨고 확인을 누르면 다음 창이 뜬다. 이게 다음 창인데, 여기서 Regcode를 맞춰서 Register me 버튼을 누르는 비밀번호 문제인 것 같다. Nag Screen 메시지창의 뜻은 모든 Nag?를 삭제(무시)시키고 올바른 registration code를 찾아라는 뜻이다. 메인 창에서도 Nag?버튼을 누르면 다시금 Nag Screen창이 뜨게 된다. 우선 책도 그렇고 문제에서 요구하는 것도 그렇고 Nag창을 없애기 위해 Nag창 부터 찾아봐야겠다. 버튼들이 있는 윈도우 폼인것을 봤을 때 버튼을 눌렀을 때 행동하게 되는 버튼 리스너 등의 처리가 있을 것이다. Nag?버튼을 눌렀을 때 Nag메시지 창이 떴던 것을 생각하면, 어떤 메시지 박스를 띄우게 하는 함수들이 있을 것이다. Search for - All intermodular calls 에서 찾아보았다. 모듈 Tut.ReverseMe1의 함수 콜 목록에서 rtcMsgBox함수를 호출하는 곳이 4군데 보인다. 4군데 다 bp를 걸어두고 Nag? 버튼을 눌러보자 bp를 건 곳중에 한군데에서 걸렸다. 이 어셈이 있는 곳에서 Nag 메시지 박스를 띄우게 하는 내용들이 있을 것이다. 좀 위를 봐보자. Nag 메시지 창에서 보았던 문자열 내용들이 있다. 이곳이 Nag 메시지를 띄우는 곳인것을 확정할 수 있다. 좀 더 올려보면 이곳 자체도 함수로 되어있는 것을 볼 수 있다. 단순히 Nag메시지 박스를 띄우지 않게 하려면 rtcMsgBox함수를 호출하지 않게 하면 된다. 함수 호출 부분을 다시 보면, 함수 호출 이후 스택을 따로 정리하지 않는 모습을 볼 수 있다. 이를 보면 함수의 호출 규약은 stdcall방식인 것을 볼 수 있다. ...
댓글
댓글 쓰기