CTF/Security Traps

[Security Traps] Swapping - C++ Trap #3

pental 2020. 4. 23. 09:51

https://securitytraps.pl/challs/cpptrap3/

 

Exploiting Machine

 

securitytraps.pl

먼저 문제를 살펴보도록 하겠습니다. 문제는 간단합니다.

Question

C++ Trap #3
int main()
{
  unsigned int x = 0xB0FF14a5;
  unsigned int y = 0x7340c00e;
  
/*INPUT*/

  if(x==0x7340c00e && y==0xB0FF14a5) victory();
  return 0;
}

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

문제의 조건은 3가지 입니다.

- Max 11 chars. (최대 11글자이며, 11글자 안으로 해결하자.)

- You can't use: "main", "victory", "asm", "&", "*", "(", "/". (위 구문들을 사용할 수 없다.)

- You have only one semicolon. (오직 하나의 세미콜론을 사용해라)

소스를 보면 알겠지만, 먼저 x, y가 선언되어 있다.

unsigned int x = 0xB0FF14a5;
unsigned int y = 0x7340c00e;

그리고 if문을 보면 x, y 값이 서로 뒤바껴야 문제가 해결된다.

if(x==0x7340c00e && y==0xB0FF14a5) victory();

그럼 이제 생각을 해봐야한다. 어떻게 해야 11글자 안으로 x와 y값을 바꿀수 있을까?

XOR Swap 이라는 것이 있다.

A = A ^ B;
B = A ^ B;
A = A ^ B;

먼저 위와 같이 이런 방식을 따르며, A와 B의 값이 서로 뒤바뀐다.

위 소스를 조금더 줄여보면 아래 소르와 같이 바꿀수 있다.

A = A ^ A ^ B
B = A ^ B ^ B

이후 위 소스를 조금 더 풀어주고, 정답을 넣어주면 문제가 해결된다.

물론 정답은 여기에 포스팅하지 않을 것이다. 정답이 정 궁금하거나, 문의가 있다면 댓글을 통해서 알려주세요!