티스토리 뷰
프로그래머를 위한 문제 #2
얼마 전 OKJSP 를 통해 이런 문제를 보았다.
문제는 아래의 코드 중 /* INPUT */
주석에 알맞은 코드를 넣어, victory() 메서드가 호출되도록 완성하여라.
필자의 컴퓨터에서는 답이 (function-48)();
로 나왔다.
typedef int (*f)();
int variable = 1;
int function() {
if(variable == 1 ) return
/* INPUT */
5;
victory();
}
int main()
{
function();
return 0;
}
[문제 코드] 위의 INPUT 주석에 알맞은 코드를 넣어라.
단 제약 조건이 있습니다.
- 다음의 문자는 사용할 수 없음 : main, victory, asm, %, *, _, #, /, “, ‘
- 최대 11자
- 세미콜론(;)은 한 번만 써야 함
문제 해결 과정 #1
일단 Visual Studio 2012 C++ 로 작성한 코드인데, 이 코드는 답을 찾아가기 위한 중간 코드이다.
이 코드를 보자마자 ‘스택 프레임(Stack Frame)’을 이용해야겠다는 맘을 먹고 코드를 작성했다. Visual Studio에서 만든 C++ 프로젝트의 속성으로 들어가서 RTC 런타임 체크 기능을 꺼야 한다. 그렇지 않으면 스택을 덮어 쓸 수가 없이, AccessViolation 오류가 발생할 것이다.
프로젝트 속성 -> 구성 속성 -> C/C++ -> Code Generation -> Basic Runtime Checks -> Default 로 변경
#include "stdafx.h"
#include <iostream>
using namespace std;
int victory()
{
cout << "victory" << endl;
return 0;
}
typedef int (*f)();
int variable = 1;
int function()
{
int a;
int n = (int)(&a) + 8;// 일반적으로 스택은 위로 자라므로, EBP + 4 의 위치를 구함
// victory 메서드 시작 위치는 현재로 부터... 765임
cout << (int)(&victory) - (int)(&function) << endl;
*(void**)n = (void*)((int)(&function) - 765);
if(variable == 1 ) return
/* INPUT */
5;
victory();
}
int _tmain(int argc, _TCHAR* argv[])
{
function();
return 0;
}
// 실행 결과
// -765
// victory
대충 그림이 나왔으니 코드를 /* INPUT */
에 들어갈 수 있도록 예쁘게 다듬어주면 될거라고 생각했다. 그런데 VC++은 타입체크가 너무 강한지 몰라도 어떻게 예쁘게 다듬어도 오류가 난다. 줸장~ 문제와는 상관 없이 좀 더 만져봐야 겠다.
문제 해결 과정 #2
오늘 정성태 과장님이 이 문제를 보고 이야기를 나누었고 답을 보여주셨다. 답은 링크를 통해 방문하면 된다.
과장님 왈, VC++ 에서는 컴파일이 안될거라고, GCC에서 컴파일 했다고 알려주셔서 나도 얼른 GCC로 바꿨다. 궁극적으로 위의 문제 해결 과정 #2 방법을 GCC로 간결하게 표현했다. 어쨌든 정성태 과장님과 답이 거의 같다.
정성태 과장님이 아니었으면 VC++만 가지고 매달렸을텐데, 문제를 풀 수 있도록 도와주신 울 과장님께 ㄱㅅ ㄱㅅ ^^
# include <stdio.h>
int victory()
{
printf("victory\n");
return 0;
}
typedef int (*f)();
int variable = 1;
int function()
{
// victory 메서드가 얼마만큼 떨어져있나 찍어봄... 48만큼...
printf("%d\n", &function - &victory);
if(variable == 1 ) return
(function-48)(); /* <------- INPUT CODE */
;
5;
victory();
}
int main(int argc, const char * argv[])
{
printf("---------------\n");
function();
return 0;
}
// 실행 결과
48
victory
'C++' 카테고리의 다른 글
[Objective-C] 아름다움을 추구하는 오브젝티브-C 언어 1/ 2- 언어적 특성 (0) | 2013.09.11 |
---|---|
[퀴즈] 프로그래머를 위한 문제 #3 - 미로 찾기 (0) | 2013.07.08 |
[퀴즈] 프로그래머를 위한 문제 #1 - 1부터 8만까지 8의 개수 (9) | 2013.07.02 |
[Qt] Qt 5.0의 webkitwidgets 사용 (3) | 2013.03.11 |
[월간 마이크로소프트 5월호 특집기사] C++ 매트로 앱 개발을 위한 C++/CX 언어 (0) | 2012.08.01 |
- Total
- Today
- Yesterday
- ***** MY SOCIAL *****
- [SOCIAL] 페이스북
- [SOCIAL] 팀 블로그 트위터
- .
- ***** MY OPEN SOURCE *****
- [GITHUB] POWERUMC
- .
- ***** MY PUBLISH *****
- [MSDN] e-Book 백서
- .
- ***** MY TOOLS *****
- [VSX] VSGesture for VS2005,200…
- [VSX] VSGesture for VS2010,201…
- [VSX] Comment Helper for VS200…
- [VSX] VSExplorer for VS2005,20…
- [VSX] VSCmd for VS2005,2008
- .
- ***** MY FAVORITES *****
- MSDN 포럼
- MSDN 라이브러리
- Mono Project
- STEN
- 일본 ATMARKIT
- C++ 빌더 포럼
- .
- Managed Extensibility Framework
- 팀 파운데이션 서버
- Team Foundation Server
- Silverlight
- Visual Studio
- 엄준일
- test
- Visual Studio 11
- 비주얼 스튜디오 2010
- LINQ
- .NET
- TFS 2010
- ALM
- MEF
- github
- testing
- 땡초
- Visual Studio 2008
- c#
- Visual Studio 2010
- monodevelop
- Windows 8
- mono
- POWERUMC
- ASP.NET
- Team Foundation Server 2010
- umc
- 비주얼 스튜디오
- TFS
- .NET Framework 4.0