[DreamHack워게임] rev-basic-5
작성자 정보
- za9uar 작성
- 작성일
본문
[메인 코드]
- 함수 입력 값: a1 (알아내야 하는 값)
- Key 값(배열): byte_140003000
- return 0i64 뜻 : return 0
- return 1i64 뜻 : return 1
- 0x18 → (10진수) 24
// i = 0; i < 0x18; ++i
- 배열은 1부터 24까지 반복된다.
[byte_140003000]
d를 누르면 byte, word, dword, qword 순으로 변환되는데
byte로 펼쳐 보는 것이 개인적으로는 편했음
h가 붙어있는 것은 hex라는 뜻인데
계산기 두드릴 필요없이 h버튼을 누르면 변환해준다. (굿)
※ byte 배열(32): [173, 216, 203, 203, 157,
151, 203, 196, 146, 161,
210, 215, 210, 214, 168,
165, 220, 199, 173, 163,
161, 152, 76, 0, 0,
0, 0, 0, 0, 0,
0, 0]
[IDA에서 확인한 코드]
if ( *(unsigned __int8 *)(a1 + i + 1) + *(unsigned __int8 *)(a1 + i) != byte_140003000[i] )
*(unsigned __int8 *)(a1 + i) 해석
1. 포인터 연산
- a1 + 1은 a1 포인터에서 i 만큼 바이트를 더한 위치를 가리킨다.
- a1은 배열의 시작 주소를 가리킨다.
2. 형 변환
- (unsigned int8 *)는 해당 주소를 unsigned __int8 타입의 포인터로 변환한다.
- 1바이트 크기의 부호 없는 정수형이다.
3. 역참조
- * 연산자는 포인트가 가리키는 주소의 값을 가져온다.
- *(unsigned __int8 *)(a1 + i)는 a1 배열의 i 번째 요소의 값을 가져온다.
if 문을 보기 쉽게 변환하면
a1[i+1] + a1[i] = byte[i]로 표현할 수 있다.
그림에서 24번째부터 32번째까지 값이 0으로 고정되어 있다.
역산을 할 수 있겠다.
a1[23+1] + a1[23] = byte[23]
→ 0 + a1[23] = 73
→ a1[23]은 73이다.
[POC - main.cpp]
#include <iostream> int main() { int byte[32] = { 173, 216, 203, 203, 157, int a1[32] = {}; for (int i = 24; i >= 0; i--) { for (int i = 0; i < 24; i++) { return 0; |
답 : All_l1fe_3nds_w1th_NULL
관련자료
-
이전