Reversing
[코드엔진] Malware Analysis 03
BIGFROG
2020. 4. 2. 17:19
u_short Malware_L03(u_short * data,u_short length)
{
register long value;
u_short i;
for(i=0; i< (length>>1) ;i++) // length를 2로 나눈 값만큼 돌림
value+=data[i];
if((length&1)==1) //비트연산 => 홀수여부
value+=(data[i]<<8); //data[i]에2^8을 곱한다 그걸 value에 합해줌
value=(value&65535)+(value>>16);
return(~value);
}
비트 연산을 해서 특정 value가 나오게 되는데, data값마다 value가 달라지게 하려는 것 같다.
checksum이 맞는 것 같음.
코드 해석을 하다가 좀 이상한 것 같아서 C로 코드를 짜서 확인해봤는데..
#include <stdio.h>
unsigned short Malware_L03(unsigned short * data,unsigned short length) {
register long value = 0;
unsigned short i;
for(i=0; i< (length>>1) ;i++)
value+=data[i];
if((length&1)==1)
value+=(data[i]<<8);
value=(value&65535)+(value>>16);
return(~value);
}
int main(){
unsigned short data[] = {1,2,3,4,5,6,7,8,9,12,15};
int length = sizeof(data) / sizeof(unsigned short);
printf("length = %d\n", length);
printf("value = %d\n", Malware_L03(data,length));
}
대충 이런식으로 짜서 돌렸다.
출력:
length = 11
value = 63984
이렇게 결과가 나오게 되는데,
저 함수는 아무리 봐도 data의 중간 이후는 의미가 없어진다.
그래서 배열의 뒤쪽 부분 값을 바꿔서 테스트했는데도 value가 똑같이 나온다.
checksum을 활용하려면 data의 모든 값에 대하여 비트연산을 진행했어야 되는게 아닌가..
그렇게해서 data 값이 하나만 바뀌더라도 value가 모두 달라지도록 만들었어야 하는 것이 아닌가 싶다..
그런데, 문제에서 애초에 악성코드의 '일부'라고 했으니 이런 식으로 checksum을 하는 것이 의도된 것일 수도 있겠다..