블로그 이전했습니다. https://jeongzero.oopy.io/
[CodeEngine] Malware Analysis L03
본문 바로가기
워게임/CodeEngn

[CodeEngine] Malware Analysis L03

728x90

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 연산
}

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
728x90

'워게임 > CodeEngn' 카테고리의 다른 글

[CodeEngine] Malware Analysis L05  (0) 2021.01.22
[CodeEngine] Basic RCE L10  (0) 2021.01.21
[CodeEngine] Malware Analysis L02  (0) 2021.01.20
[CodeEngine] Malware Analysis L1  (0) 2021.01.19
[CodeEngine] Basic RCE L20  (0) 2021.01.18