[DreamHack워게임] rev-basic-4
작성자 정보
- za9uar 작성
- 작성일
본문
[Main]
[연산자 우선순위]
※ 출처: https://learn.microsoft.com/ko-kr/cpp/c-language/precedence-and-order-of-evaluation?view=msvc-170
수식에 우선 순위를 반영하면 ((16 * a[i]) | (a[i] >> 4)) 이렇게 된다.
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자리 위치가 바뀐 것을 볼 수 있다.
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, for (int i = 0; i < 32; i++) { return 0; |
# Discussion
8 바이트로 제한해야 문제가 제대로 풀린다
제한하기 위해서는 & 0xFF 연산을 추가로 해줘야한다.
IDA에서 디컴파일하면 &0xF0을 표현해주는 버전도 있고
아닌 버전도 있는 듯 하다.
C++이 아니라
C로 문제를 풀 때는 0xFF나, 0xF0을 &(and) 연산하는 것을 하지 않아도 잘 풀린다.
관련자료
-
이전
-
다음