본문 바로가기

Android/Smishing

DES로 암호화한 스미싱 파일 분석하기

반응형


스미싱이 점점 진화하고 있다..; (소-오름)

>> 소오름 드립;;



>> 캡차를 이용한 스미싱 탐지 우회 (위의 내용과는 관련이 없습니다)


스미싱을 매일 새롭게 접하고 있는 저는 점점 공격자들의 기술이 날로 지능화 되었다는걸 많이 깨닫는데요..

(하.. 개객기들)


최근 스미싱을 분석하다가 이상한 점을 하나 발견했습니다.



읭?? 왠 악성행위는 없고 DEX만 읽어들이네.. 뭐지


읭...? 뭐지 젠장 하고 분석해 보니

APK 파일 속에 또 다른 ZIP 파일이 있다는 걸 확인했습니다.


근..데?



이게 뭔 개 똥같은 소리여;;

일반적인 ZIP 파일 구조가 아니였습니다 ㅠ ㅠㅠ


그래서 다시 분석해 보니



안녕 나는 DES 암호화라고 해 ㅎㅎ


알고 보니

ZIP 파일을 DES 암호화 하고 복호화한 후에 설치 하는것이였습니다. (소-오름)


그래서 저는 간단한(?) DES 복호화 파일 코딩을 진행했고

파일을 복호화한 결과




복구잼(apk는 실수로 이름을 잘못...)


압축을 풀고 dex2jar를 돌려보니


복구 성공!


최근 스미싱 기술들이 고도화되면서 코딩할 일이 많아졌습니다 ㅠㅠ

코딩할 일은 많아서 좋은데.. 고도화 되었다는게 조금..


복호화 코드는 딱히 공유 안해도 될듯 싶습니다.

(여러분들이 저보다 코드를 훨씬 잘 짜니깐용)


그래도 혹시 원하신다면.. 코드만 드리겠습니다. (참고로 자바 파일입니다) - 복붙

여러 분들이 복호화 코드를 요청하셔서 올려 드립니다 :)


Main.java

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Main {
	
	public static void main(String args[]) {
		
		FileInputStream localInputStream;
		try {
			localInputStream = new FileInputStream("/Users/mac/Desktop/ds");
			int i = localInputStream.available();
	        byte[] arrayOfByte1 = new byte[i];
	        localInputStream.read(arrayOfByte1, 0, i);
	        byte[] arrayOfByte2 = new DesUtils("gjaoun").decrypt(arrayOfByte1);
	        FileOutputStream localFileOutputStream = new FileOutputStream("/Users/mac/Desktop/unpack.dex");
	        localFileOutputStream.write(arrayOfByte2);
	        localFileOutputStream.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

DesUtils.java

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class DesUtils {

	public static final String STRING_KEY = "gjaoun";
	private Cipher decryptCipher = null;

	public DesUtils()throws Exception
  {
    this("gjaoun");
  }

  public DesUtils(String paramString)
    throws Exception
  {
    Key localKey = getKey(paramString.getBytes());
    this.decryptCipher = Cipher.getInstance("DES");
    this.decryptCipher.init(2, localKey);
  }

  public static String byteArr2HexStr(byte[] paramArrayOfByte) throws Exception
  {
    int i = paramArrayOfByte.length;
    StringBuffer localStringBuffer = new StringBuffer(i * 2);
    int j = 0;
    if (j >= i)
      return localStringBuffer.toString();
    for (int k = paramArrayOfByte[j]; ; k += 256)
      if (k >= 0)
      {
        if (k < 16)
          localStringBuffer.append("0");
        localStringBuffer.append(Integer.toString(k, 16));
        j++;
        break;
      }
    return localStringBuffer.toString();
  }

  private Key getKey(byte[] paramArrayOfByte)
    throws Exception
  {
    byte[] arrayOfByte = new byte[8];
    for (int i = 0; ; i++)
    {
      if ((i >= paramArrayOfByte.length) || (i >= arrayOfByte.length))
        return new SecretKeySpec(arrayOfByte, "DES");
      arrayOfByte[i] = paramArrayOfByte[i];
    }
  }

  public static byte[] hexStr2ByteArr(String paramString)
    throws Exception
  {
    byte[] arrayOfByte1 = paramString.getBytes();
    int i = arrayOfByte1.length;
    byte[] arrayOfByte2 = new byte[i / 2];
    for (int j = 0; ; j += 2)
    {
      if (j >= i)
        return arrayOfByte2;
      String str = new String(arrayOfByte1, j, 2);
      arrayOfByte2[(j / 2)] = ((byte)Integer.parseInt(str, 16));
    }
  }

  public byte[] decrypt(byte[] paramArrayOfByte)
    throws Exception
  {
    return this.decryptCipher.doFinal(paramArrayOfByte);
  }

  static class CommandRun
  {
    public String run(String[] paramArrayOfString, String paramString)
      throws IOException
    {
      Object localObject1 = "";
      try
      {
        ProcessBuilder localProcessBuilder = new ProcessBuilder(paramArrayOfString);
        InputStream localInputStream = null;
        byte[] arrayOfByte = null;
        if (paramString != null)
        {
          localProcessBuilder.directory(new File(paramString));
          localProcessBuilder.redirectErrorStream(true);
          localInputStream = localProcessBuilder.start().getInputStream();
          arrayOfByte = new byte[1024];
        }
        while (true)
        {
          if (localInputStream.read(arrayOfByte) == -1)
          {
            if (localInputStream != null)
              localInputStream.close();
            return localObject1.toString();
          }
          String str = localObject1 + new String(arrayOfByte);
          localObject1 = str;
        }
      }
      catch (Exception localException)
      {
        while (true)
          localException.printStackTrace();
      }
      finally
      {
      }
    }
  }
}



악성코드 샘플은 드리지 않습니다. fb.com/ntmalab 공식 채널을 이용해주세요


반응형