연구실:Reversing

[DreamHack워게임] rev-basic-4

작성자 정보

  • za9uar 작성
  • 작성일

컨텐츠 정보

본문

[Main]

2a8da35302090a2cb1bd7eaddfc248d9aebe3905nsox.png

 

 

[연산자 우선순위]

761cc851756c7b5c6a8445aa339847b7894a18c6n2cm.png

※ 출처: https://learn.microsoft.com/ko-kr/cpp/c-language/precedence-and-order-of-evaluation?view=msvc-170

 

 

수식에 우선 순위를 반영하면 ((16 * a[i]) | (a[i] >> 4)) 이렇게 된다.

 

f5f9d64de0639ee998a341586287049d141680468r5l.png5dbf19fbdd392bdd740ea68d809bd5dd840f06f2scl1.png

 

a[0] = 36이라고 가정했을 때,

16을 곱하는 것은 << 4 비트 시프트를 한 것과 같은 것을 알 수 있다.

 

수식은 다시 ((a[i] << 4) | (a[i] >> 4)) 가 된다.

 

a[0] = 0010 0100 (10진수, 36) 일 때,

a[0] << 4 = 0100 0000 (10진수, 64)

a[0] >> 4 = 0000 0010 (10진수, 2)

64 OR 2 = 0100 0010 (10진수, 66)

연산 결과로 a[0] 초기 값의 bit 상위 4자리와 하위 4자리 위치가 바뀐 것을 볼 수 있다.

 

 

04ee2b41f88ac96e596cc6006923a3d44498faab0s2l.png

byte[32] = {36, 39, 19, 198, 198,

               19, 22, 230, 71, 245,

               38, 150, 71, 245, 70,

               39, 19, 38, 38, 198,

               86, 245, 195, 195, 245,

               227, 227, 0, 0, 0,

               0, 0}

 

# PoC

#include <iostream>

 

int main() {

   int byte[32] = { 36, 39, 19, 198, 198,
              19, 22, 230, 71, 245,
              38, 150, 71, 245, 70,
              39, 19, 38, 38, 198,
              86, 245, 195, 195, 245,
              227, 227, 0, 0, 0,
              0, 0 };
   int flag[32];

   for (int i = 0; i < 32; i++) {
       flag[i] = (byte[i]<<4 | byte[i]>>4) & 0xFF;
       printf("%c", flag[i]);
   }

return 0;
}

 

# Discussion

8 바이트로 제한해야 문제가 제대로 풀린다

제한하기 위해서는 & 0xFF 연산을 추가로 해줘야한다.

 

IDA에서 디컴파일하면 &0xF0을 표현해주는 버전도 있고

아닌 버전도 있는 듯 하다.

 

C++이 아니라

C로 문제를 풀 때는 0xFF나, 0xF0을 &(and) 연산하는 것을 하지 않아도 잘 풀린다.

관련자료

댓글 0
등록된 댓글이 없습니다.

최근글


새댓글