Search

[CodeEngine] Malware Analysis L03

Tags
reversing
Category
CodeEngn
Last Edited time
2022/01/07 12:50
Visibility
Public

1. 문제

u_short Malware_L03(u_short * data,u_short length) { register long value; u_short i; for(i=0;i<(length>>1);i++) value+=data[i]; // data의 사이즈 절반 만큼 루프를 돌면서 // data[]의 절반까지의 모든 바이트틀 더하기 if((length&1)==1) // data의 사이즈가 홀수면 value+=(data[i]<<8); // (data[] 중간 바이트 << 8 ) 추가로 더하기 value=(value&0xffff)+(value>>16); //value 하위 2바이트 + 상위 2바이트 return(~value); // not 연산 }
C
복사

2. 접근방법

위코드의 흐름을 정리하면 다음과 같다
data의 사이즈 절반까지 값을 더한다
data의 사이즈가 홀수인 경우 절반 + 1 인덱스의 값 << 8 결과를 추가로 더한다
계산된 결과 값의 하위 2바이트와 상위 2바이트를 더한다
결과 값을 Not 연산한다.
결국 결과 값은 항상 4바이트 단위로 출력된다.

3. 풀이

형태가 패킷 체크섬 계산과 유사하다. 전송하고자 하는 값들을 전부 더한 후, 2의 보수를 취해 체크섬 바이트로 하여 전송한다.
수신 측에서 받은 값과 체크섬 값을 더하여 2진수로 표현한다. 0이면 오류가 없다는 뜻이다.
대충 체크섬 계산이 저런대 해당 코드도 비슷하다. 데이터가 조그만 달라져도 결과 값에는 큰 차이가 존재하고 이를 통해 오류를 검출 할 수 있는 식이다.
정답 : checksum

4. 몰랐던 개념

해당 코드를 파이썬에서 테스트 해봤는데 자꾸 마지막 NOT 연산이 이상함
파이썬에선 기본적으로 부호있는 정수이므로 바이트 사이즈가 정해져 있지 않아서 c언어 처럼 나오는게 아님
numpy 같은 모듈로 부호 없는 정해진 사이즈의 정수로 표현하면 가능함
이해한 바로는 파이썬에서의 ~ 연산은 1의보수임
ex) a=10, b=2 # 2의 보수 계산법 : 2의 1의 보수 + 1 # 10 + 2의보수 print(a-b) # 8 print(a-(~b+1)) #8
Plain Text
복사