전체 글: 429개의 글

PreferenceActivity 와 Fragment

Posted by ironmask84
2016. 3. 10. 16:23 나는 프로그래머다!/Java & Android


http://blog.naver.com/xinfra/80172458285

http://mainia.tistory.com/2006

http://blog.naver.com/rlawlss/80140113577

http://nekomimi.tistory.com/483

http://mainia.tistory.com/2052

http://taehoonkoo.tistory.com/132

 

정보보안관련 좋은 레퍼런스 사이트

Posted by ironmask84
2016. 3. 3. 08:54 컴퓨터공학/Security


http://www.boannews.com/default.asp

-> 보안관련 뉴스


http://isms.kisa.or.kr/kor/intro/intro01.jsp

-> ISMS 인증제도


http://www.kisa.or.kr/public/laws/laws3.jsp 

-> kisa 정보보호 가이드

 

악성코드를 이용한 해킹의 종류 및 대처법

Posted by ironmask84
2016. 2. 15. 00:49 컴퓨터공학/Security




1. Stack Buffer overflow 공격

1) strncpy() 사용해서 버퍼만큼만 복사하거나, if문으로 문자열 크기 비교체크해서 복사하면 해결


    process가 메모리에 로딩되었을 때의 메모리 구조에는 몇몇의 영역으로 구분되어있다.

       이는 low address부터 나열하면 다음과 같은 순서이다.


       Code Area (실행코드 위치, 기계어)

       Data Area (초기화 된 정적변수 및 전역변수)

       BSS Area (초기화 되지 않은 정적변수 및 전역변수)

       Heap (동적메모리 할당)

       Stack (함수를 처리하기 위한 영역, 함수 내 로컬변수, 함수의 매개변수)

 

위 영역 중에 Stack 영역에서 Buffer overflow 를 이용한 공격방법은 아래와 같다.

 

예를들어 어떤 프로세스의 main함수에서 func() 함수를 호출될 때,

func() 함수 처리 후 돌아왔을 때 수행되어야할 주소 RET를 저장하고,

func() 함수를 기준으로 하기위해 기존의 main함수의 EBP 레지스터를 저장하고,

func() 함수의 로컬변수 등 처리를 위한 데이터들이 stack에 push/pop 되어가며 수행되다가

func() 처리가 끝나면, 위에서 저장했던 RET, EBP를 불러와서 기존 main함수로 되돌아 오게 된다.

 

위 과정에서 RET를 임의의 주소로 덮어쓸 수 있다면,

해커는 이를 악용해서 공격용 process를 미리 메모리에 로딩해놓고, 이 process의 주소로 덮어쓰게 하여,

새로운 shell을 root권한으로 실행하는 등의 행위로 root권한을 획득할 수 있게 된다.

 

위 공격을 하려면 2가지 조건이 전제되어야 한다.

1) 공격에 이용하려는 프로세스는 root 소유이고, setuid가 설정되어 있어야 한다.

2) 악용하기 위한 공격용 process를 미리 메모리에 로딩해놓아야 한다.

 

*  CPU에는 여러 레지스터가 있지만, 아래 3가지를 참고하자.

1) ESP : 스택 연산이 발생하는 스택 프레임의 최상위 포인터 (EBP를 기준으로 상대위치 의미)

2) EBP : 해당 스택 프레임의 베이스 포인터

3) EIP : 다음에 실행할 명령어의 주소값을 가지고 있다. (= Program Count)

 

 

2. Race Condition 공격

   1) A 프로세스가 /tmp 디렉토리에 tmp.dat 라는 파일을 생성하고 오픈해서 write를 한다고 하고,
      A프로세스가 root소유의 프로세스이고, tmp.dat 라는 파일에 root권한을 가지도록 setuid를 한다고 가정.

      이 시점을 캐치하여, 공격용 프로세스를 통해 tmp.dat라는 동일한 이름의 파일을 심볼릭 링크파일로 해서 
      /etc/shadow와 같이 중요한 파일에 링크를 건 파일을 생성시킨다.


   2) 위 과정에서 A 프로세스와 공격용 프로세스가 tmp.dat라는 파일을 누가 먼저 생성 시키는지의 race가 발생하게 된다.
      정상적인 경로를 통해 A 프로세스가 먼저 tmp.dat 파일을 생성시키면,
      공격용 프로세스는 이 파일을 지우고, 자신이 생성시킨 파일을 수행하도록 유도할 것이다.


  ** 여기서도 마찬가지로 공격에 이용하려는 A 프로세스는 root 소유이고, setuid가 설정되어 있어야 한다.

 

 

3. Format String 공격

   1) process가 메모리에 로딩되었을 때의 메모리 주소에 잘못된 데이터를 덮어씀으로 인한 공격
   2) printf 계열의 함수 사용 시 틀리지 않고 쓰면 해결, %n은 변수의 주소값 이다.




 

BroadcastReceiver 간단 정리

Posted by ironmask84
2016. 2. 1. 15:20 나는 프로그래머다!/Java & Android


안드로이드에는 BroadcastReceiver 라는 Callback 이벤트를 처리해주는 컴포넌트가 제공됩니다.


쉽게말해서, A라는 앱을 만들었는데, 

문자가 왔을 때 어떤 데이터를 받고 싶다던가 배터리가 50% 이하가 되었을 때 뭔가 변화를 주고 싶다고 한다면

SMS 앱이나 배터리체크 앱에서 어떤 이벤트를 데이터와 함께 날리게 되고,

A에서는 그 이벤트와 데이터를 받아서 원하는 기능을 처리하도록 할 수 있다는 것입니다.


위에서 언급한 이벤트처리를 복잡하지 않고 쉽게 처리해주는 녀석이 BroadcastReceiver 라는 컴포넌트 인 것입니다.


아래에 2가지 방법에 대한 예시를 올립니다.


1. BroadcastReceiver 클래스를 상속  (AppWidgetProvider 도 가능, 아마 BroadcastReceiver를 가지고 있겠지..)

   onReceive() 를 Override해서 기능 정의

   androidManifest.xml에 등록되어 있어야 함.

 androidManifest 이용해서 등록하면, 명시적으로 해제해줄 수는 없다. (unRegisterReceiver 불가능)
    (
onReceive() 메소드가 완료되면 가비지 컬렉션 대상이 되서 해지될지도... 언제 될지는 모름...)


   ex) <receiver android:name=".favorite.MissedCallWidget" >

            <intent-filter>

                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />

                <action android:name="lge.intent.action.MISSED_CALLS" />

            </intent-filter>


            <meta-data

                android:name="android.appwidget.provider"

                android:resource="@xml/missed_call_widget_info" />



2. Actvity, Service, ContentProvider에 registerReceiver() 내에서 등록한다. 

   * onDestory() 에서 this.registerReceiver() 해줬던것을 해제가능 (메모리 누수 방지 효과도 있음)


ex) 이미 있는 action이 아니라, 새로 만든 custom action을 이용한 예시

public static final String ACTION_KEY_CODE = "com.ironmask.home.KEYCODE_ALERT";

private BroadcastReceiver mKeyCodeReceiver = null;


onCreate() 

{ .........

MyregisterReceiver();

  .........

}


onDestory()

{ ...........

    this.unRegisterReceiver(mKeyCodeReceiver);


MyregisterReceiver() {

if (mKeyCodeReceiver != null)

return;


        IntentFilter filter = new IntentFilter();

        filter.addAction(ACTION_KEY_CODE);


this.mKeyCodeReceiver = new BroadcastReceiver() {

       @Override

       public void onReceive(Context context, Intent keyintent) {

           String action = keyintent.getAction();


           if (ACTION_KEY_CODE.equals(action)) {

...

};

this.registerReceiver(this.mKeyCodeReceiver, filter);

}


미리 Broadcast를 제공하는 App에서 아래와 같이 수행해 놓으면, 위 Receiver가 동작!! 

(SMS, Call 등 이미 기본 안드로이드 App에서 제공되는 것들도 많다.)

Intent keyCodeAlert = new Intent("com.ironmask.home.KEYCODE_ALERT"); 

keyCodeAlert.putExtra("key_code", keyCode);


mContext.sendBroadcast(keyCodeAlert);


--> 위의 예시가 맞는지 다시 확인 필요...


즉, 2번 예시의 경우도, com.ironmask.home.KEYCODE_ALERT이라는 액션을 가진 Activity 내에서 
위의 과정이 있어야 한다...


 

2015년 서울장애인 IT챌린지

Posted by ironmask84
2016. 1. 29. 16:16 생각과 일상/봉사생활


2015년 7월에 매해 열리는 서울장애인 IT챌린지가 있었습니다.

회사에서 많이 후원하는 봉사활동이어서, 자원신청하여 참가하였죠.


하는 업이 IT관련이며, 이를 이제는 사명으로 생각하고 있기에
사회에 조금이나마 공헌도 하고 싶었습니다.


청각이 약하신분, 팔,
다리가 불편하신분, 뇌에 장애가 있으신분 등 다양한 분들이 참가하는 자리였습니다. :)
한글, 파워포인트, 인터넷 활용 능력이 주 대회였죠 ^^



대회에 몰두하는 모습이 보기좋습니다. ㅎㅎ


IT 대회 뿐 아니라, 장기자랑의 시간도 있었습니다. ^^



어디서 많이본 토끼와 곰이죠?


네이버에서 후원하는 상품들이 많았습니다.


IT챌린지 참여자들과 봉사자분들 단체 샷, 가운데 잘보시면 강원래씨가!!



IT라는 도구가 인류에 편리한 도구로써 활용되고, 악용되지는 않았으면 좋겠습니다.