-
문제설명

소스코드

풀이

이번 문제의 경우 비트 연산을 통해 나온 결과 값을 다시 초기 상태로 되돌려 해당 값 입력을 통해 FLAG를 획득하는 문제이다.
소스코드 수행으로 생성된 문자열은 사진에서 볼수 있듯이 1_c_3_c_0__ff_3e 이다.
소스코드 부분에 주석을 통해 코드를 설명한 상태이지만 다시한번 설명하면 아래와 같다.
코드 설명

초기 값을 세팅하는 단계이다.

org 값에 대한 연산이 수행되어 이를 현재의 결과 값인 1_c_3_c_0__ff_3e 이 출력되게 하는 단계이다.
org의 값이 82라 하자.
이를 2진수로 변환할시 01010010이된다.
i = 0 일때, 0만큼 쉬프트 연산이 수행되기에 0101 0010에 대해 우측 쉬프트를 할 시 그 값은 0101 0010이다.
( >> X : X의 값 만큼 화살표 방향으로 쉬프트 연산 적용, 비는 공간은 0으로 채우기)
이후, & 0xf 즉 AND 1111을 수행할 시 res의 값은 0010(2)이 된다.
i = 1일때, 4 * 1 = 4 즉, 4만큼 쉬프트 연산을 수행할 시 그 값은 0000 0101이된다.
이후, AND 연산 수행 시 res의 값은 0101(5)이 된다.
이때 주의 할점으로는 res의 값이 만약 0보다 크고 12보다 작은 값이며 NOT 연산 수행 시 그 값이 0x4(4)와 같을 경우, st 리스트에 '_' 문자로 변환하여 저장한다.
그렇지 않을 경우는 값을 그대로 문자열로 저장하며, 0 또는 12보다 클 경우에는 16진수로 변환하여 st 리스트에 저장한다.
위의 연산을 거쳐서 나온 값을 다시 비트로 변경 후 10진수로 바꿔준다면 문재를 해결 할 수 있다.
해결코드

해당 코드를 통해 10진수 값을 얻을 수 있었고 코드 실행을 통해 나온 값을 입력할 시 아래와 같이 FLAG 획득이 가능하다.

'개인공부 > 드림핵' 카테고리의 다른 글
random-test (0) 2025.01.18 Type c-j (0) 2025.01.04 baby-union (0) 2025.01.02 BypassIF (0) 2025.01.01 what-is-my-ip (0) 2024.12.31