Write-up

[securitytrap.pl] Exploit/Riddles The Truth writeup

ch4rli3kop 2019. 5. 1. 17:01
반응형

[securitytrap.pl] Exploit/Riddles The Truth writeup


[summary] code injection
C++ Trap #1

int main()
{
 <-----  put your solution here!
 if((1==1)==false) victory();
 return 0;
}

Your main objective is to call the victory function.
You must put one line of your code:
- Max 18 chars.
- You can't use: "main", "victory", "asm", "&", "*", "(", "/".
- You have only one semicolon.

victory()를 실행하는 것이 목표이다. 다만 정상적으로 실행될 경우 1==1 이 true이므로 해당 조건을 만족할 수가 없으므로 코드 한줄을 입력하여 해당 조건을 만족시켜야 할 것이다.

처음에 든 아이디어는 define 같은 매크로 함수를 이용하여 false를 참으로 바꾸는 것과 c++이라길래 연산자 오버로딩을 통하여 ==을 변경하는 것이었다. 적당히 +정도로만 변경해도 if 조건문이 true가 되기 때문에 victory()가 실행될 것이다.

처음 시도한 것은 define을 이용하여 false를 변경하는 것이었는데, 바보같이 세미콜론(;)을 뒤에 붙이고 시도하느라 삽질을 좀 많이 했다.;;

#define false 1

을 입력한다면 쉽게 flag를 얻을 수 있다.

연산자 오버로딩은 일단 입력할 수 있는 문자 개수가 18개 밖에 안되서 하기 힘든거 같다..

그 밖에 혹여나 로컬 변수로 false를 선언하면 bool false 1; 될까 싶었는데, 역시나 안됨 ㅜ

https://4programmers.net/Forum/C_i_C++/175217-c++_zmiana_wartosci

여기에 누가 질문한 게 있는데 이 문제 같다. 여러 사람들이 재미난 풀이 방법들을 토론하는데 신박한 방법이 있어 서술한다. 사실 이 문제와는 조건이 살짝 달라 사용할 수는 없지만, 비슷한 문제가 있을 경우 유용하게 사용할 수 있을 것이다.

다음과 같이 if 조건과 victory()가 한 줄에 있지 않은 경우에 사용할 수 있다.

[input]
if((1==1)==false)
   victory();
  1. //\ if 문에 앞서 해당 코드를 입력한다면, if의 조건 문은 주석 처리가 되어 결과적으로 victory()가 실행될 것이다.

  2. #define x \ 이 코드의 동작방식도 위와 비슷하다. 다만 이 코드는 if의 조건 문을 매크로 함수의 일부분으로 해석하여 if 문을 없애줄 뿐이다. 역시 결과적으로 victory()가 실행되게 할 수 있다.


반응형