디컴파일 한 것이 아래와 같습니다. 질문 내용 부분입니다.
int main()
{
.....
char *var;
int i;
Byte local_68[40];
.....
printf("enter password: ");
var = fgets((char*)local_68, 0x20, stdin);
.....
i=0
while(i<6);{
if((int)(char)(local_68[i]^0x8a) != local_77[i])
.....
}
궁금한 것은,
Q1.
배열 local_68[40]={'a','b','c','d',1,2,3,4,...}이 이렇다면,
위 굵은 글씨에 대입해보면
(int)(char)('a'^0x8a)가 되는데요..'a'를 0x41로 바꾸면
(int)(char)(0x41^0x8a)이 됩니다.
그런데 굳이 char 에서 int 으로 두 번 변경하는 이유가 있을까요?
Q2.
local_68[40]은 값을 받아서 저장하는 배열입니다.(fgets함수)
배열은 같은 형의 자료를 넣는 것으로 알고 있습니다. int형은 숫자, char형은 문자..
그런데 예를 들어 adde1234 이렇게 쓰면 local_68[40] 배열에 저장이 무슨 형태로 되는 것 인지요. 위에 보시면 byte형이라고 되어있는데 처음 보는것이라서요
A1)
_Byte
는 IDA가 바이트를 지칭하기 위해 사용하는 타입으로, C언어의 타입이 아닙니다. 여기부터는 확실하지 않은데, _Byte
가 unsigned로 취급되기 때문에 일단 (char)
캐스팅으로 sign을 부여한 다음 (int)
캐스팅으로 sign-extend하는 것으로 추측해 봅니다... 기술적으로는 그렇고 의미상으로는 크게 신경쓰지 않아도 될 것 같습니다.
A2)
_Byte
는 앞서 말씀드렸듯 IDA의 바이트 타입입니다. C언어 타입으로는 unsigned char
에 해당합니다. IDA가 바이너리를 디컴파일할 때, 어떤 1바이트 크기의 변수가 원본 코드에서 char
로 선언되었는지 unsigned char
로 선언되었는지 알기 어렵습니다. 따라서 유저가 C언어 스타일의 타입을 따로 지정(단축키 'y')해주지 않는 이상, 1바이트 변수를 기본적으로 _Byte
로 나타낼 것입니다.
fgets
함수는 유저가 입력하는 문자열을 배열에 저장합니다. 문자열은 char *
내지는 char[]
로 (즉, 1바이트 데이터들의 나열) 표현하는 것이 자연스럽습니다. 따라서 local_68
의 메모리를 1바이트씩 나타내면 이렇게 됩니다 -> {0x61, 0x64, 0x64, 0x65, 0x31, 0x32, 0x33, 0x34, 0x00, ...}