ida 디컴파일러(pseudo code)해석 문제입니다.

디컴파일 한 것이 아래와 같습니다. 질문 내용 부분입니다.

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형이라고 되어있는데 처음 보는것이라서요

#리버싱 #도구
작성자 정보
답변 1
avatar
연주
2023 Christmas CTF 참여

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, ...}

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