[Security Traps] Hello World! - C++ Trap #7
https://securitytraps.pl/challs/cpptrap7/
조금 어려운 문제다.
- You can't use: "main", "asm", "puts", "printf", "putc", "write", "builtin", "#", "*", "&", "_", ";", ",", "\".
위에 나온것들을 사용하지 않고 최대 50글자로 Hello World! 를 출력해야한다.
이런 생각은 해보지 않았을거라고 생각하는데 일반적으로 Hello Wolrd!를 출력하기 위해서
#include <stdio.h>
int main()
{
printf("Hello World!");
return 0;
}
이렇게 printf를 사용하고 있다 또는 아래와 같은 예제도 가능하다.
#include <stdio.h>
int main()
{
puts("Hello World!");
return 0;
}
이렇게 puts를 사용하는 방법도 있다. 하지만 문제에서는 printf와 puts를 사용하지 않고 Hello World!를 출력해야한다.
아! 물론 ";" 세미콜론도 사용할수 없습니다.
문제의 의도를 파악해보면 아래와 같다.
1. 세미콜론을 사용하지 않고, 출력문이 정상적으로 작동되게 할수 있는가?
2. printf와 puts를 대체할것이 있는가?
3. 50자 안에서 해결가능한가?
먼저 1번 의도인, 세미콜론을 사용하지 않고, 출력문을 정상적으로 작동되게 할수 있을까?
먼저 정답은 가능하다! 이다. 과연 어떻게 하면 세미콜론을 사용하지 않고, 작동되게 할수 있을까?
if문을 사용하면 출력이 가능하다! 어떻게 가능한 일 일까?
#include <stdio.h>
int main()
{
if(printf("Hellow World!"))
{
}
return 0;
}
if문에서는 세미콜론 없이 이렇게 printf문을 사용할수 있다. 물론 scanf 등등 다른 함수들도 마찬가지이다.
그럼 printf와 puts를 대체할 것이 있을까?
아쉽지만, 필자는 대체할 것을 찾지 못했다..
그럼 다르게 접근해보도록 하자. 어떻게 하면 puts나 printf를 불러올수 있을까?
#include <stdio.h>
#define print printf
int main()
{
if(print("Hellow World!"))
{
}
return 0;
}
#define으로 printf나 puts를 정의하면 위 소스 처럼 사용할 수 있다.
필자에게는 신기한 발견이었다. 파이썬에서 쓰던 print를 c언어에서 사용한다니...
접근 방향은 매우 좋았던거 같지만, 문제를 보면 #을 사용할 수가 없다고 합니다.
그럼 새로운 문제가 생겼다. 4번 문제는 #을 대체할 것을 찾아야한다. 어떤것이 있을까?
필자는 구글링 도중 새로운 것을 발견했다.
https://en.wikipedia.org/wiki/C_alternative_tokens
https://en.cppreference.com/w/c/language/operator_alternative
C언어에서 Alternative tokens를 사용할수있습니다!
#은 %:로 바꿔서 쓸수 있다고 합니다!
#include <stdio.h>
int main()
{
%:define print printf
if(print("Hellow World!"))
{
}
return 0;
}
이렇게 #대신 %:로 대체해서 소스를 실행해보면 정상적으로 작동합니다.
하지만 이미 50글자를 넘어가 버렸습니다. 그 뿐만 아니라 printf를 사용할수 없기때문에,
printf를 우회할수 있는 방법을 찾아 보았습니다.
##을 사용하면 우회할수 있습니다!
#include <stdio.h>
int main()
{
%:define print print##f
if(print("Hellow World!"))
{
}
return 0;
}
이렇게 우회가 되었는데요, 이제 이걸 50자로 줄이면 문제를 해결할 수 있습니다.
정답 소스는 따로 올리지 않겠습니다. 이제 위 내용을 바탕으로 소스를 짜서 해결하시면 됩니다!
감사합니다. 추가적인 문의나 오탈자는 댓글에 남겨주세요!
'CTF > Security Traps' 카테고리의 다른 글
[Security Traps] Swapping - C++ Trap #3 (0) | 2020.04.23 |
---|