2013년 7월 30일 화요일

[Android] 디버깅과 리버싱


안드로이드 어플리케이션 파일인 apk 는 dex, resources와 library 로 구성되어 있는 압축파일이다.

여기서 dex 파일은 어플리케이션의 소스 파일이며 class를 거쳐 java 파일로 디컴파일 하면서

어플리케이션 소스를 분석할 수 있다.


1. 디컴파일을 위한 툴 설치

1.ApkTool
- 다운로드 : http://code.google.com/p/android-apktool/downloads/list

2.Dex2Jar
- 다운로드 : http://code.google.com/p/dex2jar/downloads/list

3.Java Decompiler
- 다운로드 : http://java.decompiler.free.fr/?q=jdgui


2. apk 파일 추출

$ adb shell # 추출하고자 하는 apk 파일의 위치를 찾음

$ adb pull /data/app/com.xxx.apk # 파일 추출


3. apk 파일을 디코딩

$ apktool d com.xxx.apk out # asset, res, smali(소스파일), xml, yml 파일을 얻을 수 있음

> java -jar apktool.jar d com.xxx.apk out 

4. Dex2Jar 을 통해 Java 파일 추출

apk 파일을 zip 확장자로 바꾸고 압축 해제해서 classes.dex 파일 추출

$ dex2jar classes.dex # classes.dex.dex2jar.jar 파일을 얻을 수 있음


5. JD-GUI 를 이용해 Java 소스 분석

가끔 Java Decompiler 가 소스를 제대로 디컴파일 하지 못하는 경우가 발생한다.

소스 보기를 하면 // INTERNAL ERROR // 라는 오류 메세지만 뜰 뿐 소스가 보이지 않아 당황스러웠지만,

다른 Java 디컴파일러인 DJ Java Decompiler 를 사용하면 제대로 보인다.


6. java 소스를 참고해 smali 소스를 수정해서 리버싱


7. smali를 다시 컴파일하고 apk 파일 생성

$ apktool b out

ex)

$ adb uninstall ops.black.herpderper
$ apktool b herp patched.apk
alias keytool='java -Dfile.encoding=utf8 sun.security.tools.KeyTool ' // only for mac user
$ keytool -genkey -v -keystore my.keystore -alias anyalias -keyalg RSA -validity 10000
$ jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore my.keystore patched.apk anyalias 
$ adb install patched.apk


8. apk 파일 릴리즈 (키 생성 및 사인) - optional

0. only for mac user
alias keytool='java -Dfile.encoding=utf8 sun.security.tools.KeyTool '

1. 키 생성
$ keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -validity 10000

혹은 eclipse 에서 export->android application 을 통해 생성

2. 키 사인

$ jarsigner -verbose -keystore my-release-key.keystore my_application.apk alias_name


9. 안드로이드 패킷 캡쳐 - optional

carpedm20:/$ adb shell
shell@android:/ $ su
root@android:/ # tcpdump -i rmnet1 -s 0 -w /sdcard/ab.pcap

10. Example


$ adb pull /data/app/com.kakao.talk-1.apk
> java -jar apktool.jar d com.xxx.apk out 
$ adb uninstall com.kakao.group
$ apktool b out patched.apk
$ keytool -genkey -v -keystore my.keystore -alias anyalias -keyalg RSA -validity 10000
$ jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore my.keystore patched.apk anyalias
$ adb install patched.apk

2013년 7월 29일 월요일

Paros 윈도우 64bit에서 사용법


웹 request와 response를 분석할때 사용되는 paros 가 윈도우 64비트 환경에서

실행이 안되는 오류가 발생한다.

설치후 pars를 실행시키면 javaw.exe 파일을 찾을 수 없다는 오류가 뜨는데,

자바 경로가 32bit 환경에 맞춰져 있기 때문에 이러한 문제가 발생한다.

paros 바로가기가 \System32\javaw.exe -jar paros.jar 이런식으로 정해져 있을텐데

\SysWOW64\javaw.exe -jar paros.jar 로 바꿔준다면 문제없이 실행된다.

[Python] openCV를 이용해 스도쿠 그림 인식 및 계산 예제




다음과 같은 스도쿠 이미지를


위와 같이 refactor 한 후,


점점 contour 를 조정해 가면서 숫자를 알아낸다


혹은 아래처럼 스도쿠판의 네 꼭지점을 먼저 찾아서 스도쿠 범위를 정하는 방법도 있다




그림 인식에는 openCV 가 사용된다.

코드를 한달 전 정도에 짜서 내용도 잘 기억 안나고, 코멘트도 영어로 단 상태인데,

조만간 수정할 계획이다 :)

# author = 'carpedm20'
import cv2
from cv import *
from cv2 import *
import numpy as np

img =  cv2.imread('sudoku.jpg')

# can remove lots of noises by blur effect
gray = cv2.GaussianBlur(gray,(5,5),0)
#cv2.imwrite('gaussian.jpg',gray)

# change color from RGB image to Gray image
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

mask = np.zeros((gray.shape),np.uint8)
kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11))

close = cv2.morphologyEx(gray,cv2.MORPH_CLOSE,kernel1)
div = np.float32(gray)/(close)
res = np.uint8(cv2.normalize(div,div,0,255,cv2.NORM_MINMAX))
res2 = cv2.cvtColor(res,cv2.COLOR_GRAY2BGR)

# adaptive threshold : taking a best value for a local neighbourhood
# threshold : find treshold taking image as a whole
thresh = cv2.adaptiveThreshold(gray,255,1,1,11,2)
cv2.imwrite('img_thresh.jpg',thresh)

white = Closing[src, DiskMatrix[5]];
srcAdjusted = Image[ImageData[src]/ImageData[white]]

# # of contour by mode
# CV_RETR_EXTERNAL < CV_RETR_LIST < CV_RETR_CCOMP < CV_RETR_TREE
#contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

biggest = None
#biggest = []
max_area = 0
for i in contours:
 # calculate area of contour
        area = cv2.contourArea(i)
        if area > 100:
  # calculates a contour perimeter or a curve lengt
  # closed : True - Flag indicating whether the curve is closed or not
                peri = cv2.arcLength(i,True)
                #peri = cv2.arcLength(i,False)
  # Approximates a polygonal curves with the specified precision.
                approx = cv2.approxPolyDP(i,0.02*peri,True)
                #approx = cv2.approxPolyDP(i,0.02*peri,False)

                if area > max_area and len(approx)==4:
                #if len(approx)>=4:
                        biggest = approx
                        #biggest.append(approx)
                        max_area = area

# -1 : indicating a contour to draw, negative means all contours
# (0,255,0) : RGB
# 3 : width of countour, negative means fill the countours
cv2.drawContours(img, biggest, -1, (0,255,0), 2)

cv2.imwrite('contour.jpg',img)

def rectify(h):
        h = h.reshape((4,2))
        hnew = np.zeros((4,2),dtype = np.float32)

        add = h.sum(1)
        hnew[0] = h[np.argmin(add)]
        hnew[2] = h[np.argmax(add)]

        diff = np.diff(h,axis = 1)
        hnew[1] = h[np.argmin(diff)]
        hnew[3] = h[np.argmax(diff)]

        return hnew

approx=rectify(biggest)
h = np.array([ [0,0],[449,0],[449,449],[0,449] ],np.float32)

retval = cv2.getPerspectiveTransform(approx,h)
warp = cv2.warpPerspective(gray,retval,(450,450))

cv2.imwrite('warp.jpg',warp)

reference : http://opencvpython.blogspot.in/2012/06/sudoku-solver-part-1.html

[Python] virtualenv로 python을 위한 sandbox 만들기


sandbox라고 표현하는게 맞는지는 모르겠지만 느낌은 sandbox다.


파이썬 모듈을 설치할 때 대부분의 사람들은 pip와 easy_install 과 같은 프로그램을 사용해

간편하게 설치하지만 동일 이름의 다른 모듈이 존재할 때 모듈이 꼬이는 귀찮은 상황이 발생할 수 있다.


virtualenv를 사용하면 현재 시스템에 설치된 python 모듈을 사용하지 않고고 독립적인 공간에서

virtualenv 설정이 된 폴더에 따로 python 모듈이 설치되도록 한다.


예를 들면

carpedm20@HeXA:~/python/flaskr$ tree -d venv -L 3
venv
├── bin
├── include
│   └── python2.7 -> /usr/include/python2.7
├── lib
│   └── python2.7
│       ├── config -> /usr/lib/python2.7/config
│       ├── distutils
│       ├── encodings -> /usr/lib/python2.7/encodings
│       ├── lib-dynload -> /usr/lib/python2.7/lib-dynload
│       └── site-packages
└── local
    ├── bin -> /home/carpedm20/Python/flaskr/venv/bin
    ├── include -> /home/carpedm20/Python/flaskr/venv/include
    └── lib -> /home/carpedm20/Python/flaskr/venv/lib


다음과 같이 flaskr 라는 폴더 안에 venv 폴더가 virtual 환경으로 설정이 되고,

그 안에 bin, lib, local 과 같은 시스템 폴더들이 생겨 라이브러리와 파이썬 바이너리가 저장이 된다.


설치법과 사용법은 아래와 같다


$ sudo apt-get install python-setuptools
$ sudo easy_install virtualenv

$ virtualenv --no-site-packages venv # --no-site-packages:현재 시스템의 site-package와 저의 지역 환경을 연결하지 않도록

$ echo "venv" >> .gitignore # git 사용시 virtual 환경이 push되는것을 막음

$ . venv/bin/activate # virtual 환경을 시작한다

$ pip install flask # 보통 다음과 같이 모듈을 설치하지만
$ pip install -r requirements.txt # 설치할 모듈 리스트가 있는 requirements.txt 파일이 있다면 다음과 같이 설치할 수 도 있다

$ pip freeze > requirements.txt # 현재 virtual 환경에 설치된 모듈들의 리스트를 requirements.txt에 저장

$ . venv/bin/deactivate # virtual 환경을 종료한다

[Python] Flask 블로그 예제


python을 언어로 사용하는 웹 프레임워크에는 유명한 Django 가 있지만,

배우는데 시간이걸리고 복잡해서 저는 Flask라는 프레임 워크를 이용해 개인 블로그를 만들어 보았습니다.

아직 개인 서버와 도메인이 없어서 블로그를 옮기지는 않고 있지만, 준비가 되는데로 옮기려고 합니다 :)

혹시 Flask를 이용해 블로그나 웹 사이트를 구현하고 싶은데 참고하고 싶은 예제를 찾고 계시는 분은

https://github.com/carpedm20/personal-blog-powered-by-flask

여기서 소스를 참고하시면 될 것 같습니다

Flask에 대한 기본적인 튜토리얼은

http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world

여기를 참고하시면 됩니다

Framework를 사용해 아무것도 없는 상태에서 글쓰기, 글수정, 사진, markdown 기능, 소스코드 highlighter 등의 기능을 구현해 보면서

블로그라는걸 가볍게 생각하고 만들기 시작하면 안된다는걸 배웠습니다..

특히나 저에게 웹 디자인과 css는 정말 악몽이었습니다...

아래 사진은 블로그를 run한 사진입니다 :)

URL : http://carpedm20.us.to




2013년 7월 28일 일요일

백트랙 개요


아래 글과 마찬가지로 일년전 백트랙을 처음 알았을때 만들었던 ppt 자료입니다. 

초보적인 메타스플로잇 명령어를 사용하는 법과 시연에 관해 설명하고 있는 자료인데, 

큰 정보는 얻으실 수 없을것 같지만, 해킹에 관심을 갖기 시작했으나

뭘 해야할지 모르시는 분들은 한번쯤 보시면 백트랙이 뭔지 아실수 있을거 같아 공유합니다.



해킹의 개요


일년 전 제가 해킹에 대해 공부를 막 시작할때 즈음 만들었던 ppt 자료입니다.

아는게 거의 없었을때 인터넷에서 아무거나 막 찾아서 만들어서

개요랄것도 없는 허접한 자료이지만...

이제 해킹에 관심을 갖고 계신분들은 한번쯤 해킹에 대해 맛볼수 있는 자료일것 같아 공유합니다

상당히 오래전에 만든 ppt고, 출처에 대한 개념이 없었던 때라 몇몇 사진들은

인터넷에서 퍼온 자료인데, 어디서 가져왔는지 기억이 잘 안나네요..

출처는 여기에 나와있는 사이트 중 하나인거 같은데

문제가 된다면 알려주세요 :)