디스컴파일 된 코드를 잘 모르겠어요
{
  int i; // [rsp+0h] [rbp-18h]

  for ( i = 0; (unsigned __int64)i < 0x1C; ++i )
  {
    if ( ((unsigned __int8)(16 * *(_BYTE *)(a1 + i)) | ((int)*(unsigned __int8 *)(a1 + i) >> 4)) != byte_140003000[i] )
      return 0i64;
  }
  return 1i64;
}```
디스컴파일 된 코드에서
(a1 + i) 이 부분이 a1[i] 이랑 똑같은 코드라는데 왜 이런식으로 쓰나요? 그리고 이러한 내용은 어디서 공부해야하나요?

그리고 혹시 더 a1이라는 파라미터에 문자값을 여러개 입력 받아서 문자 배열이 만들어 지는 건가요?(그래서 a1[i] 같은 형태로 나온것이고)
#reversing
작성자 정보
답변 1
avatar
Archi
대표 업적 없음

안녕하세요.

우선, 제 답변이 틀릴 수도 있다는 점 감안해 주시고 읽어주시면 감사하겠습니다.

위에 올려주신 소스를 Decompile 하기전에는 sub_140001000함수에 v4 인자가 넘겨지는데요, 아래 그림에서도 확인하실 수 있듯 v4는 256Byte 크기의 char 자료형 입니다. (3번째 줄에 선언됨)

v4 인자

v4 자료형을 인지한 상태에서 sub_140001000 함수를 Decompile 하면 v4인자는 __int(64비트 정수 자료형)a1 으로 형 변환 된 것을 확인할 수 있습니다.

__int 64 a1

이제 여기서(7번째 줄 if문) 우리는 포인터 연산을 통하여 배열에 접근이 가능해집니다. (주소를 증가시켜서 * 연산자를 통해 메모리의 값에 접근)

v4[i] = *(v4 + i) == a1[i] = *(a1 + i) <- 모두 같은 요소를 가르킴

해당 내용은 배열과 포인터의 관계에 대해 공부하시면 이해가 쉬우실 듯 합니다. (c언어, 알고리즘)

2022.08.02. 14:00
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기