대신증권 온라인 주식거래 서비스인 "크레온"을 사칭하는 피싱사이트가 발견되어 내용을 간단하게 정리해봤습니다.

피싱사이트는 어떻게 생겼나? 2% 부족한데?


크레온을 사칭한 피싱사이트 크라이 트레이딩 닷컴!

피싱사이트 제작자는 정상 크레온 사이트의 회사 로고와 동일한 아이콘과 명칭을 가져다가 사용한 것으로 보인다. 저 사이트를 처음 봤을 때 "크레온 서비스를 사용하는 사용자들을 대상으로 한 피싱사이트겠지?"라는 생각을 했다. 하지만 보통 주식거래를 하기 위해서는 공인인증서 로그인이 필수적이다. 수려한 웹 디자인에 속을 뻔했지만 여긴 한국이기 때문에 공인인증서를 피해 갈 수 있는 금융회사의 PC용 웹사이트는 없다.

그럼 뭐하는 곳이야?


긴가민가한 상태에서 회원가입 버튼을 눌러봤더니 뭐하는 곳인지 느낌이 왔다. 금융회사를 사칭했으니까 계좌번호 OK, 휴대폰 번호 OK, 추천인 코드는??? 어디서 많이 본 가입 양식이라고 느껴졌는데 바로 불법 도박사이트(사설토토) 가입 양식이었다.

추천 직원도 아니고 추천인 CODE는 뭐냐 ...

그래서 더 분석할 것도 없고 WOHIS로 마무리.

whois 결과 13일 밖에 안된 도메인이네

도박은 패가망신의 지름길이니 도박하지 마세요! 🥺

IoC (Indicator of compromise)


  • 사설토토 도메인, IP : cry1-trading[.]com, 104.27.149.61(미국, AS13335)
,

이제부터 너는 사람을 낚는 어부가 될 것이다.

피싱은 항상 이슈를 따라다닙니다. 이번에 발견된 피싱은 코로나 이슈를 따라 일본 정부의 정책으로 만들어진 지원 사업을 빙자해 피싱을 시도했습니다. 일본 내 이슈를 왜 분석을 했는지 궁금하실 텐데요. 그 이유는 피싱사이트가 한국 IP를 사용했기 때문입니다. 이에 관련된 내용을 간단하게 정리해 봤습니다.

어떻게 발견하였나?


2020년 10월 15일 일본 총무성(우리나라의 행안부) 공식 트위터에서 "총무성을 사칭하는 특별 지원금 사이트 개설과 관련된 내용을 담은 피싱이메일을 보낸 적이 없으니 주의하라"라는 트윗이 올라왔다.

총무성 공식 트위터에 올라온 피싱주의 트윗

 

트윗에 첨부된 이미지의 문구 번역

피싱 관련 주요 내용


총무성 사칭 피싱 이메일 내용은 다음 이미지와 같고, 내용은 "총무성에서 2차 특별 지원금 사이트를 개설했으니 링크에 접속해서 신청" 하라는 내용을 담고 있다.

피싱이메일 본문 내용

해당 피싱 이메일에 포함된 악성 링크의 도메인과 연결된 IP주소가 한국것으로 확인되며, 당시 시점에 접속했을 때 화면 캡처 등을 여기(https://urlscan.io/ip/14.63.172.200)에서 확인할 수 있다.

피싱사이트 접속화면

일본 총무성에서는 실제 지난 5월부터 특별 지원금 관련 사업을 진행하며 웹사이트(https://kyufukin.soumu.go.jp)를 운영중에 있으며, 1인당 10만 엔의 특별 지원금을 지급했는데 최근에 종료된 것으로 보인다.

총무성이 개설 운영중인 특별 지원금 정상사이트

두 사이트의 디자인은 유사하며, 정상사이트의 많은 리소스를 피싱사이트에서 가져다 쓴 것으로 보인다. 사람을 속이는 피싱에 있어 모방은 매우 중요하기 때문에 공격자가 자체적으로 디자인할 이유는 없다. 그리고 웹사이트에서 사용하는 CSS 등 디자인에 필요한 요소들은 서버사이드가 아니다 보니 숨길 수 없기 때문에 어쩔 수 없는 부분이다.

피싱 사이트 더 파보기


어쨋든 한국 IP를 사용하고 있는 피싱사이트를 더 살펴보면 공격 대상 국가는 일본이지만, 정상 사이트를 살펴봤을 때 등록된 외국인도 10만 엔을 지원받을 수 있는 것으로 확인된다. 따라서 일본인뿐만 아니라 일본 내에 거주하고 있는 등록된 외국인(한국인)도 피싱의 피해자가 될 수 있다.

Whois 서비스로 해당 IP를 확인해 봤을 때 KT에서 관리하는 한국 IP로 확인되며, 연결된 웹사이트가 23개임을 볼 수 있다. (10월 15일 기준으로 22개였는데, 10월 16일 기준으로 1개 늘어났다.)

피싱사이트 IP에 연결된 23개의 연결된 사이트

15일 기준으로 22개의 연결된 사이트는 다음과 같다.

account-rakuten-co-jp.icu
account-rakuten-co-jp.xyz
account-rakuten.top
account-rakuten.xyz
mon-check.xyz
rakuten-account.best
rakuten-account.cyou
rakuten-account.icu
rakuten-account.top
rakuten-account.world
rakuten-co-jp-account.best
rakuten-co-jp-account.cloud
rakuten-co-jp-account.club
rakuten-co-jp-account.cyou
rakuten-co-jp-account.top
rakuten-co-jp-account.xyz
rakuten-co-jp.live
rakuten-co-jp.men
rakuten-co-jp.trade
rakuten-co-jp.world
rakuten-verify.cyou
rakuten-verify.xyz

대부분의 도메인에서 "rakuten" 이 확인되는데, 일본에 "rakuten"이라는 유명 쇼핑몰 브랜드가 존재하는것을 확인했다. 다만, 라쿠텐과 특별 지원금과의 관계는 정확히 모르겠고, 라쿠텐이라는 회사도 OO페이 같은 지급결제 서비스가 존재하기 때문에 지원금 충전 목적의 계정 탈취 같은 시나리오가 있지 않을까 추정해본다.

아무튼 피싱사이트에서 지원금 신청하기를 진행하게 되면 개인정보를 입력하는 페이지로 이동되며, 한자이름, 일본어 이름, 국적, 생년월일, 성별, 주소, 마이넘버(우리나라의 주민등록번호), 여권번호 등 다양한 개인정보를 입력하게끔 구성되어 있다. 당연히 이런 정보를 입력하고 제출하게 되면 입력된 정보는 유출되게 되고 2차 피해를 당하게 될 것이다.

개인정보 입력을 받는 피싱페이지

결론


피싱은 사회적 이슈를 이용한다는 점과 주변 국가로 전파되는 특징이 있는데, 코로나 지원금은 이미 우리나라에서도 국가 정책으로 진행되었던 사업이다. 이런 유사한 피싱이 발생할 가능성은 충분히 있어 보인다. 그리고 국내 IP대역에서 타국을 대상으로 삼는 피싱사이트를 신속하게 발본색원해야 우리도 역으로 이런 비슷한 경우가 발생했을 때 적절한 조치를 요청할 수 있지 않을까 생각하며 이번 포스팅을 마무리한다.

IoC (Indicator of compromise)


  • Domain
    • account-rakuten-co-jp.icu
    • account-rakuten-co-jp.icu
    • account-rakuten-co-jp.xyz
    • account-rakuten.top
    • account-rakuten.xyz
    • mon-check.xyz
    • rakuten-account.best
    • rakuten-account.cyou
    • rakuten-account.icu
    • rakuten-account.top
    • rakuten-account.world
    • rakuten-co-jp-account.best
    • rakuten-co-jp-account.cloud
    • rakuten-co-jp-account.club
    • rakuten-co-jp-account.cyou
    • rakuten-co-jp-account.top
    • rakuten-co-jp-account.xyz
    • rakuten-co-jp.live
    • rakuten-co-jp.men
    • rakuten-co-jp.trade
    • rakuten-co-jp.world
    • rakuten-verify.cyou
    • rakuten-verify.xyz
  • IP
    • 14.63.172.200(한국)

 

,

해외에서는 Sextortion이라는 용어로 알려져 있습니다. 국내에서는 몸캠 사기, 몸캠 피싱과 같은 용어로 불려지고 있는데 엄밀히 따지자면 Sextortion은 성관련 협박 범죄를 총칭하는 의미가 될 수 있기 때문에 몸캠 피싱이 Sextortion 범죄의 여러 종류 중 하나라고 볼 수 있겠습니다. 몸캠 피싱의 주된 피해자는 남성이며 생식기가 대뇌의 컨트롤을 벗어난 경우에 주로 피해가 발생하게 됩니다. 주소록에 삭제하지 않은 전 여자 친구에게까지 본인의 나체를 영상으로 공유하고 싶은 게 아니라면, 모르는 이성과의 은밀한 데이트는 오프라인에서 만나 안전한 장소에서 합의하에 하시길 바랍니다. 이에 관련된 내용을 정리해 봤습니다.

 

몸캠 피싱 앱은 어떻게 생겼나?


몸캠 피싱 앱은 위와 같은 아이콘과 함께 "요가영상", "갤러리", "Support", "동영상", "상상톡", "비밀채팅", "야밤톡" 등 다양한 이름을 가지고 있다.

 

악성 앱 (com.android.mobilephone)


  • 몸캠 피싱에 사용되는 악성 앱이 요구하는 권한
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

  • 실행하면 보이는 화면

클랜 앱같은 소리 ...

악성 앱은 최초 실행 시 필요 권한을 사용자에게 요청하도록 팝업을 띄우게 되며 허용하는 순간 기기에 저장된 주요 정보가 C&C 서버로 유출된다. 여기서 말하는 주요 정보는 "전화번호, IMEI, 기기 모델명, 주소록, 전화 송수신 내역, SMS 송수신 내역, 저장된 사진과 동영상" 등이다. 즉, 감염되는 순간 매우 개인적인 정보들이 유출되는데 범죄자 입장에선 고마운 일이고, 피해자 입장에선 돌이킬 수 없는 결과를 낳게 된다.

 

C&C 서버 (222.239.248[.]195, KR, AS9318)


C&C 서버는 이렇게 생겼는데 한글이 보이네?

C&C 서버는 이렇게 생겼다. 아이디와 비밀번호를 입력하고 접속하게 되면 아마도 감염된 기기들이 리스트업 되어 있고, 감염된 기기에서 업로드된 정보들을 볼 수 있는 메뉴로 구성되어 있을 것이다. C&C 서버의 IP주소는 SKB가 관리하는 국내 대역이라는 건 불편한 진실이다.

 

결론


C&C 서버를 국내 대역을 쓰는만큼 수사가 시작되면 증거물 압수에는 문제가 없을 듯한데, 한 가지 이상한 점은 C&C 서버의 IP주소가 호스팅 업체 대역이 아니라 ISP 대역이라는 점이다. 정상적인 시스템을 해킹해서 C&C로 기생하고 있는 것인지 간 큰 공격자가 집에서 C&C를 돌리고 있는 건지는 모르겠다. 블로그에서 공개할 수 없는 재밌는 내용이 몇 개 있는데, 이 내용들은 따로 정리해서 비공개 모임에서 다룰 예정이다.

 

IoC (Indicator of compromise)


  • C&C 서버
    • http://222.239.248[.]195/erf/Home/
  • 분석에 사용된 샘플
    • (sha256) 0fad128f4aa25df09b5981c6949cb72a0d178b0d36e3a0a26dee45215e5d90bc
,

대한민국 법무부를 사칭하는 악성 앱이 발견되었는데, 악성 앱 내부에 또 다른 악성 앱이 숨겨져 있는 구조가 확인되었습니다. 이에 관련된 내용들을 정리해봤습니다.

악성 앱 안의 악성 앱


com.helloworld.mytest 안에 com.emersonclimate.aebulletin

com.helloworld.mytest 앱을 열어서 Assets 경로를 들여다보면 com.emersonclimate.aebulletin라는 앱이 숨겨져 있는 것을 확인할 수 있다. PE 악성코드에서도 실행파일의 리소스 영역에 악의적인 코드를 추가로 숨겨두는 경우가 종종 있는 것처럼 이 경우도 비슷한 경우라고 판단된다. 하지만 PE 악성코드처럼 리소스 영역으로 쉽게 분기하는 형태가 아니라 Assets 경로 안에 숨겨진 앱을 인스톨하는 형태기 때문에 관련된 코드들을 봤을 때 com.helloworld.mytest는 "악성 앱 인스톨러"라고 불러야겠다. 

com.helloworld.mytest 의 AndroidManifest.xml 중 일부
인스톨과 관련된 코드 중 일부

 

인스톨러 (com.helloworld.mytest)


인스톨러는 스팸전화와 관련된 앱들이 설치되었는지 확인하고 설치되어 있을 경우 사용자에게 악성 앱으로 소개하며 삭제를 유도한다.

this.setContentView(0x7F09001F);  // layout:activity_web
this.mPkgArray = new String[]{"com.ktcs.whowho", "gogolook.callgogolook2", "com.andr.evine.who", "com.whosthat.callerid", "kr.co.thecall", "com.whox2.lguplus", "com.lguplus.blocksmishing", "tpkorea.com.moim"};
this.mWebView = (WebView)this.findViewById(0x7F0700D4);  // id:webview
WebSettings v11_1 = this.mWebView.getSettings();
v11_1.setJavaScriptEnabled(true);
v11_1.setDomStorageEnabled(true);
this.mWebView.setWebViewClient(new e(this, null));
this.mWebView.loadUrl("file:///android_asset/web/" + this.mType + ".html");
this.mWebView.setBackgroundColor(0);
int v11_2 = this.mType;
if(v11_2 == 2) {
    this.mHandler.postDelayed(this.mRunnable, 666L);
}
else if(v11_2 == 3) {
    this.addedReceiver();
    c.b(this.mContext, "K_INIT_SCAN_DONE", "ok");
}
else if(v11_2 == 4) {
    try {
        c.a(this.mContext);
        this.startActivity(new Intent("android.intent.action.VIEW", Uri.parse("openqjaanqnauth://hello")));
    }
    catch(Exception unused_ex) {
    }
}

정상 앱들을 보고 악성 앱이라고 하지만 법무부를 사칭하기 때문에 사용자들은 충분히 속을 수 있다.

법무부를 사칭하는 악성 앱이 정상 앱을 삭제하라네 ... ?

만약 스팸전화와 관련된 앱들이 하나도 없다면 탐지된 스파이앱이 없다고 친절하게 알려준다.

스파이앱이 스파이앱이 없다고하면 ...

 

악성 앱 (com.emersonclimate.aebulletin)


  • 설치되는 악성 앱이 요구하는 권한
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="android.permission.BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_UPDATES" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_MMS" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

 

  • 악성 앱 파일의 내부

인스톨러를 통해 설치되는 악성 앱의 내부

악성 앱 파일 내부를 보면 secret-classesN.dex 파일들이 존재하는데 이 파일에 실제 악의적인 행위를 하는 코드들이 들어 있다. 하지만 중국 개발자가 만든 프로텍터로 암호화 되어있기 때문에 복호화하지 않으면 정적 분석은 불가능하다. 물론 키값을 알고 있으면 복호화해서 정적 분석을 할 수 있는데, 이번 경우에는 개발자의 실수(?)로 인해 암호화된 dex 파일을 복호화하는 루틴과 관련된 키 값이 존재하지 않아 암호화된 dex 파일을 복호화할 수 없었다.

 

결론


2020년 9월 2일에 수집된 이 앱은 안타깝게도 정상적으로 동작하지 않는다. 개발자의 실수인지 의도인지 모르겠지만 인스톨러가 내부에 가지고 있는 악성 앱을 인스톨 조차 하지 못하는 문제가 있고, 숨겨진 악성 앱도 강제로 추출해서 확인해본 결과 앱 구성상에 문제가 있어 인스톨러가 악성 앱을 정상 설치 했더라도 동작하지 못했을 것이다. 공격자의 실수로 좋은 힌트를 얻었으니 이제 앞으로 벌어질 공격에 대비만 하면 되겠다.

 

IoC (Indicator of compromise)


  • 피싱 사이트
    • http://nimabi7.gnway[.]cc/seoul/kics/login.html
  • 앱 설치 후 등록되는 아이콘

이런 앱이 실제로 있나?

,

HDCON 2017 rock.apk write up

from War Game 2017. 9. 19. 13:06

배점은 100점이며, 가위 바위 보에 연속적으로 이겨서 플래그를 획득할 수 있다는 문제이다.

파일크기가 800kb 가 안되는 apk 파일을 문제로 제공한다.

apk 파일 열어 일단 Manifest 를 봤다.


메인엑티비티와 CallMe, WhyCall 이라는 2개의 리시버가 보인다.

그리고 각 리시버들의 priority 값이 할당되어 있는데 CallMe는 1이고 WhyCall은 2이다.

둘다 core.hdcon.android2017.oops 로 호출이 되는데 priority 값 때문에 단순히 호출만으로는 절대 CallMe를 동작시킬 수 없다.

근데 문제 풀이를 위해서 딱히 중요한 내용은 아니다.


Libraries 를 보면 so 파일이 들어 있는데 앱에서 일부 사용되는 native 함수가 구현되어 들어 있다.

이 so 파일은 문제를 풀기 위해 반드시 분석해야되는 파일이다.

(팁: genymotion 은 x86기반 에뮬레이터다.)

Resources->values->strings.xml 을 보면 아래와 같은 내용을 확인할 수 있다.


소스외에 것들은 대충 본것 같으니 이제 소스코드를 보자.

아래는 MainActivity 에 onCreate 코드이다.


MainActivity.this.e 변수가 들고 있는 값이 putExtra 를 통해서 mm 이라는 이름으로 전달된다.

그럼 mm 의 상호참조를 한번 확인해보자.


CallMe의 onRecevie 에서 mm 을 참조하는가 보다.


CallMe의 onReceive 코드를 보니 getString 으로 mm 이 가지고 있는 값을 읽어 오는게 보이고...

그 바로 아래 try 내부에 구현된 코드를 보면 느낌이 딱 온다.

혹시나 저 코드를 보고 아무런 느낌이 오지 않는다면 절레절레… (그렇다고 너무 실망은 하지 마시고 더 열심히 하시면 됩니다.)

배열에 넣고 길이값 만큼 지지고 볶는코드이고, 오랜만에 보는 삼항연산자도 있다.

v4[v1] = v1 < 0x10 ? A : B

전자의 조건식이 참이면 A를 실행하고 거짓이면 B를 실행하는 무시무시한 코드다.

어쨋든 A, B 모두 ck 함수를 호출하는데 이게 또 native 함수다. 즉 위에서 봤던 so 파일에 기능이 구현되어 있기 때문에 apk 만 봐서는 절대 무슨 형태로 문자열을 작살내는지 확인할 길이 없다.

좋은회사라면 당신에게 hexray 를 사줬을 것이다. (hexray를 사주지 않았다고 해서 꼭 나쁜회사는 아니다. 핸드레이를 열심히 하시면 됩니다.)

그럼 아래와 같이 편하게 ck 함수의 슈도코드를 볼 수 있다.

onReceive 에 구현된 코드와 ck 함수를 본인이 원하는 언어로 옮겨 담으면 90%가 끝난다. (저는 python 을 좋아해서 python 으로 옮겨 담았습니다.)



다시 CallMe 의 onReceive 를 보자.


각 변수들이 어떤 값을 가지고 있는지 무슨 용도일지 감이 대부분 잡힌다.

그런데 v7은 v3를 참조한다는거 말고는 어떤 값을 가지고 있는지 현재로서는 알 수 없다.

v3 또한 getString으로 mm의 값을 가져오는데 mm의 값이 뭔지 알 수 없다.

그럼 putExtra로 mm을 던지는 MainActivity로 다시 가보자.


mm의 값은 MainActivity.this.e 를 참조하고, MainActivity.this.e는 rps_calc 을 통해 만들어지는것을 최종적으로 알 수 있다.

rps_calc은 native 함수다. 다시 so 파일을 보자.

hexray로 rsp_calc 함수부분을 보면 k 값이 17916 이상일때 동작하는 코드가 보인다. 

이쯤 되면 느낌이 오지 않는가!


rps_calc 함수 자체는 가위 바위 보 게임을 할때 이기거나, 비기거나, 졌거나 등의 메시지를 다루는데, v10을 보면 뭔가 이상한 문자열이 보인다.

‘S=TX’, ‘^=_=‘, … 그리고 v14의 0(null)까지 하나의 문자열이므로 한줄로 줄을 세워보면…

XT=S=_=^=”= =!=' 이 된다.

그리고 이 문자열을 xor 하는 do while 을 보면 v9 값으로 하나씩 xor 시켜주는걸 볼 수 있다. v9은 ae의 값을 가지며, ae는 0x10 이다.

코드를 간단하게 짜서 돌리면 …


17916 점수를 넘기게 되면  HD-C-O-N-2-0-1-7 이라는 문자열이 만들어진다.

안타깝지만 이 문자열은 flag 값이 아니고, mm 이라는 이름으로 전달되어 flag 를 디코딩(?)하는데 사용되는 값이다.

퍼즐은 다 모았으니 다시 코드를 간단하게 짜서 돌리면 …



이렇게 최종적으로 flag 값을 얻을 수 있다.


모든 문제를 다 풀지는 못했지만 이 문제는 ‘게싱’이 덜 필요한 그나마 정상적인 문제였다고 생각한다. 


,

Simple Self Modifying Code (SMC)

from RCE 2014. 8. 25. 02:57

개인적인 경험에 근거하여 Drive-By Download로 드랍된 악성코드에서 자주 볼 수 있었던기법이다.

Self Modifying Code를 우리말로 하면 "자체 코드 수정" 정도 되겠다.

위 예제 코드는 ExitProcess 함수를 호출하는 코드이다.

당연히 눈치 채셨겠지만 cmd 배열안에 선언된 값이 0x01과 XOR 연산을 마치고나면 ExitProcess 함수의 주소가 된다.

이러한 형태의 코드를 분석할 때 위 예제와 같이 간단한 경우라면 Key 값과 Decrypt 할 값을 바이너리에서 추출해 XOR 연산을 시키면 깔끔하게 실행가능한 Opcode가 나오기도 하는데, 그렇지 않을 경우 그냥 디버거에서 천천히 Tracing 해보면 본래 Opcode를 얻을 수 있다.

,

#if defined(__WIN64)
#define CROSS_ACCESS KEY_WOW64_32KEY
#else
#define CROSS_ACCESS KEY_WOW64_64KEY
#endif

,

100년 만에 블로그에 글을 써본다.

괜찮은듯한 바이너리용 프레임워크가 있어서 흔적을 남기고자 한다.

viper 라는 이름이고, cuckoo sandbox 주인장이 참여하는 프로젝트 같다.

https://github.com/botherder/viper

Viper

Viper is a binary analysis and management framework. Its fundamental objective is to provide a solution to easily organize your collection of malware and exploit samples as well as your collection of scripts you created or found over the time to facilitate your daily research. 

python 기반이라 설치에 큰 무리는 없으리라 본다. (사실 조금 난감했던게 osx 를 사용하는데 이거 viper에 필요한 모듈설치를 brew랑 pip 를 섞어서 썼다가 참조하는 환경변수 경로에 문제가 생겼다. osx 에서 인스톨러(?)를 여러 방법으로 쓰시는 분들은 꼭 참고하시길 바란다.)

:)


,