2020년 8월 14일 금요일

사이트 이전했습니다.

원래 사용하던 티스토리로 이사했습니다. 5초 후 자동 이동 chmodi.tistory.com

2013년 11월 3일 일요일

.apk 파일 정적 분석 방법2

지난 글에 이어서 apktool을 이용하여 디컴파일 하는 방법에 대해 설명하겠습니다.

  • 아래 툴이 필요합니다.
  • Apktool 폴더에서 Shift + 마우스 우클릭 -> 여기서 명령창 열기 를 합니다.

(apktool 폴더의 위치를 환경변수 Path에 등록시킨 후 아무데서나 명령창을 실행시켜도 됩니다.)

clip_image001

  • apktool.bat d [apk 파일의 위치] 실행

clip_image002

  • 디컴파일된 파일들이 현 위치에 폴더로 생성된 것을 볼 수 있습니다.

clip_image003

  • 아래는 AndroidManifest.xml 파일의 내용입니다. 암호화가 안돼있어 내용을 확인할 수 있습니다.

clip_image004

  • Smali 코드의 위치는 디컴파일된 폴더의 smali 폴더 안에 있습니다.

clip_image005

  • 이전에 소개한 압축해제를 통한 방법과 이 방법을 이용하여 apk 파일의 정적 분석을 하시면 됩니다.

clip_image006

apktool-install-windows-r05-ibot.tar.bz2

clip_image006[1]

apktool1.5.2.tar.bz2

2013년 9월 29일 일요일

인터넷 IP 변경 배치 파일

2013.09.29 20:09

제가 노트북을 들고 다니기 때문에 일일이 설정하기 귀찮아서 한번 만들어봤습니다.

고정 IP와 동적 IP 모드를 설정하실 수 있으며, 고정 IP는 해당 파일 안에 미리 적어놓은 프로파일로 변경됩니다.

만약 설정할 IP를 변경하려면 메모장 등과 같은 편집프로그램을 통해 아래 숫자들을 바꿔 주시면 됩니다.

(ip, gateway, dns 값을 변경)

clip_image001

clip_image002

네트워크 변경.zip

Batch 파일 한글 깨짐

Batch 파일에 한글을 입력하고 실행했더니 한글이 깨져서 많이 놀라셨죠~?? 저도 제 파일보고 많이 놀랐습니다~

흠흠…포스팅에 집중 집중..

분명 한글을 출력하도록 만드셨는데 막상 실행해보면 한글이 깨져서 출력되는 경우가 있습니다. 문제는 다른 배치파일들은 멀쩡히 출력하는데 이 파일만 깨져서 출력이 됩니다. 썩을…

분명히 한글로 입력했지만

clip_image001

출력은 한글이 깨져서 나온다.

clip_image002

해결방법은 매우 간단했습니다...검색해도 결과가 없던게 당연할 정도로…

그 방법은 파일을 저장할 때 사용한 인코딩 형식의 차이였습니다.

위의 파일의 경우 UTF-8형식으로 인코딩되어 있습니다.

clip_image003

이를 ANSI 형식으로 바꾼 후 저장하면

clip_image004

정상적으로 출력이 되는 것을 볼 수 있습니다.

2013년 9월 27일 금요일

CodeEngn Basic Clear

clip_image001

끝~~Basic 문제를 모두 풀었습니다~!

2013년 9월 24일 화요일

CodeEngn Basic 20

2013.09.24 19:28

clip_image001

파일 안에 있어야 할 데이터의 HEX값을 찾아야하는 문제입니다. 아래는 파일을 그냥 실행한 경우입니다. 아무것도 없는 파일이 실행됩니다.

clip_image002

파일을 올리디버거를 이용해 여시면 CreateFile 함수를 통해 파일에 접근하는 핸들을 리턴한 후 ReadFile을 통해 파일의 데이터를 불러는 것을 확인할 수 있습니다.

clip_image003

ReadFile 부분을 자세히 보시면 HEX로 12 즉 DEC로 18byte를 읽어오도록 설정하고 있습니다. 파일 호출이 끝난 다음에도 제대로 읽어왔는지 확인하고 있습니다. 분석을 위해 파일 안에 임의의 값으로 18byte를 채워넣고 실행해보겠습니다.

(크랙된 창에서 CodeEngn! 이 나타나는 걸로 봐서 파일을 통해 입력받는 듯합니다. 그래서 CodeEngn!이 포함된 문자열로 문제를 풀어보겠습니다.)

clip_image004

실행해보시면 아시겠지만 함수를 호출하고 나면 입력받은 문자열들의 값이 바뀌며 호출하기전엔 아무값도 없던 4020F9 주소의 값을 12345678 과 XOR 연산을 한 후 값을 비교하고 있습니다. 아래는 비교하는 곳까지 실행한 모습입니다.

clip_image005

제가 입력했던 문자열 끝의 4자리수를 받아 비교하는 것을 볼 수 있습니다. HEX editor를 이용해 값을 동일하게 수정한 후 실행한 모습입니다.

clip_image006

크랙에는 성공하였으나 정답과는 거리가 먼 화면입니다. 수정된 문자열이 창에 출력되는 듯 합니다. 값이 0x00이면 그 뒤는 처리되지 않고 그대로 놔두고 있습니다. 게다가 메시지 창에 출력시 느낌표하나가 추가되는 걸로 봐서 수정된 문자열이 CodeEngn 이 되도록 crackme3.key 파일의 내용을 수정해야겠습니다. 먼저 문자열을 수정하는 함수 내부로 들어가 어떻게 수정하는지 확인해보겠습니다.

clip_image007

함수 내부 코드입니다. 자세히 풀어보자면 [ESP+4]의 주소에 저장된 값(파일을 통해 입력받은 문자열이 저장된 곳입니다.) 에 대해 0x41 부터 0x4F까지 BL의 값을 증가시키면서 XOR연산으로 문자열을 수정하고 있습니다. 이는, CodeEngn을 입력하여 수정된 문자열을 crackme3.key 파일에 입력하면 이번에는 CodeEngn이 수정된 문자열로 나오게 된다는 뜻입니다. 이제 crackme3.key 파일을 알고리즘에 맞게 수정(가운데 5자리의 쓸모 없는 부분이 있습니다. 이 부분 때문에 정답이 여러 개가 나옵니다. 저는 전부 0x00이 되도록 수정하였습니다.) 시리얼 부분도 변경되기 때문에 맞춰서 변경해주세요

clip_image008

수정한 후 실행하면 성공입니다.

clip_image009

2013년 9월 22일 일요일

CodeEngn Basic 19

2013.09.23 03:10

clip_image001

이번에는 PEiD 가 아닌 exeinfope 라는 툴로 살펴보겠습니다.

http://www.exeinfo.xn.pl/ 사이트인데 접속이 안되네요. 아래에 파일 올려놓았습니다.

clip_image002

Autoit으로 프로그래밍했고 upx 패킹이 되어있네요. Autoit은 스크립트언어의 일종입니다. 배우기 쉽데요. ㅋ

참고로 autoit 은 자체적으로 upx 패킹을 지원합니다. 올리디버거로 직접 언패킹을 하려 했지만 지식과 경험의 부족으로

툴을 사용하였습니다. 어떤 분이 autoit으로 upx 툴을 만드셨더라구요. http://blog.naver.com/seongwk/70122005613 여기서 받으실 수 있습니다. 못 받으시는 분들은...역시 아래에 파일을 올렸습니다.

이제 문제 풀이에 들어가겠습니다. 먼저 언패킹을 해주세요.

clip_image003

언패킹이 끝나면 이제 올리디버거를 이용해 문제를 풉니다. 올리디버거로 열어 실행을 해보면 에러가 뜹니다.

clip_image004

이 오류가 뜨는 이유는 안티 디버깅이 설정되어 있기 때문입니다. 사용하는 함수는 IsDebuggerPresent 입니다.

이는 올리디버거의 플러그인 중에 Olly Advanced 에서 우회가 가능합니다.

clip_image005

이 함수의 코드를 보고 싶은 분은 코드창 -> 마우스 우클릭 -> Search for -> All intermodular calls 혹은 Name (label) in current module(Ctrl + N) 을 클릭합니다. 그 후에 IsDebuggerPresent를 입력하여 해당 함수를 찾습니다. BreakPoint를 설정하고 실행하면 IsDebuggerPresent에서 멈추는 데 안으로 들어가서 JMP로 분기를 하고나면 다음과 같은 코드가 보입니다.

clip_image006

PE구조에 대해서는 자세히 모르지만 구글신과 네이년의 도움으로 찾은 내용을 말씀드리자면

  1. FS 레지스터에서 오프셋 0x18 에 있는 TIB(Thread Information Block) 의 주소를 EAX에 저장합니다.
  2. TIB 에서 오프셋 0x30에 있는 PEB(Process Environment Block)의 주소를 EAX에 저장합니다.
  3. PEB 에서 오프셋 0x2 에 있는 BeingDebugged 의 값을 EAX 에 저장합니다.
  4. 이 값이 1인 경우 디버거를 사용 중이라는 뜻입니다.
  5. 아래는 올리디버거로 해당 값을 확인한 모습입니다.

clip_image007

계속해서 문제를 풀어보겠습니다. 위와 같은 방법으로 창을 열어 timegettime 함수를 찾습니다.

Name (label) in current module 창

clip_image008

All intermodular calls 창

clip_image009

Timegettime 함수는 http://msdn.microsoft.com/en-us/library/windows/desktop/dd757629%28v=vs.85%29.aspx 여기서 확인하실 수 있습니다.(한글페이지가 없어서 영어로 뜨네요….)

간단히 설명하면 시스템의 시간을 milliseconds로 가져오는 함수입니다. 위에서 처럼 BreakPoint를 지정한 후 실행을 하면 CALL EDI 부분에서 멈추는 걸 볼 수 있습니다.

clip_image010

차례대로 분석해나가시면 timegettime 함수의 주소를 EDI 에 저장한 후

CALL EDI 를 통해 함수를 호출하고 있습니다. 제일 처음의 결과는 ESI 레지스터에 옮겨놓은 후 다시 호출하여 비교한 후

JNB(Jump if Not Below, CF가 0인 경우 분기)를 통해 분기할지 결정합니다. 즉, 나중에 받은 값이 크거나 같으면 분기하는 군요. 분기한 곳으로 이동해서 계속 분석합니다.(JNB에서 Enter만 치면 됩니다.)

clip_image011

분기한 곳의 코드들입니다. EAX와 ESI의 차를 구한 후 [EBX+4]에 저장된 4byte의 값과 비교한 후 JNB를 이용하여 분기를 결정하고 있습니다. 아래에 있는 JNZ에서 분기를 하면 다시 시간을 받아오는 군요. 즉 EBX+4의 값이 우리가 원하는 시간임을 유추할 수 있습니다. CMP EAX, DWORD PTR DS:[EBX+4] 에 BreakPoint를 걸고 실행합니다.

clip_image012

이 값으로 인증을 하면 문제는 풀립니다.

clip_image013

exeinfope.zip

clip_image014

UPXTool.exe