레이블이 etc인 게시물을 표시합니다. 모든 게시물 표시
레이블이 etc인 게시물을 표시합니다. 모든 게시물 표시

2022년 3월 27일 일요일

fishing app(피싱앱) 분석 시도

어느날 갑자기 문자가 왔습니다. 나를 낚기 위해서... 앱이 어떤식으로 동작하는지 궁금해져서 확인해본 내용을 정리해봤습니다.


동작은 메세지가 오고 링크를 누르면 공공기관 홈페이지와 비슷한 사이트를 만들어서 apk를 다운로드 하도록 유도합니다.




APK를 받아서 apk decomile을 시도해보았습니다.

요즘에는 온라인툴들이 좋아져서 3종의 온라인 apk decompiler를 이용하여 비교하였습니다.

1) http://www.javadecompilers.com/apk

2) https://www.decompiler.com/

3) https://appscms.com/apk-decompiler

1,2 번은 비슷한 수준이며

그중 가장 결과물이 좋은것은 아래 컴파일러였습니다.

https://appscms.com/apk-decompiler


비교

1,3비교

파일 하나만 차이납니다.

한쪽은 거의 decompile하지 못함

소스 분석

시작은 AndroidManifest.xml 에서 부터 시작합니다.

이런 프로그램들은 재부팅 시점에도 동작하게 만들어야 하기때문에 BOOT_COMPLETED 인텐트를 받아서 동작하는 코드가 있어야합니다.

열어보면 아래와 같은 부분이 보입니다.

        <receiver android:name="gl2z9b6.dw">

            <intent-filter>

                <action android:name="android.intent.action.BOOT_COMPLETED"/>

            </intent-filter>

        </receiver>

부팅 되었을때 여기를 호출한다는 코드이고 gl2z9b6.dw  여기를 따라가보면 jw.e를 실행 시키도록 되는데

package gl2z9b6;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class dw extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        jw.e(context);
    }
}


jw 코드는 서비스 관련 코드로 계속 메모리에 실행되도록 하는 코드인데 조금만 따라가보면 native(C언어)코드로 연결되어 있습니다. 

package gl2z9b6;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;
import dmvtga.pj.ggkgoq.ry.R;
import j.oi;

public class jw extends Service {
    static boolean a;

    private void a(Intent intent) {
        if (!a) {
            a = true;
            try {
                Object[] objArr = {((DzApplication) getApplication()).a, this, intent, new int[]{R.drawable.ic_launcher, R.layout.main, R.id.textView}, "", 0};
                oi.py(objArr[0], objArr[1], objArr[2], objArr[3], null);
                d(c(), getSystemService("alarm"));
            } catch (Exception unused) {
            }
        }
    }

    private void b(long j2, Object obj, Intent intent, int i) {
        oi.ih2(obj, this, intent, j2);
    }

    private static long c() {
        return SystemClock.elapsedRealtime() + 22000;
    }

    private void d(long j2, Object obj) {
        b(j2, obj, new Intent(getClass().getName()), 1);
    }

    public static void e(Context context) {
        try {
            oi.s2t(context, jw.class);
        } catch (Exception unused) {
        }
    }

    public IBinder onBind(Intent intent) {
        return null;
    }

    public void onCreate() {
        a(null);
    }
}

package j, native 연결되는 코드

package j;

public class oi {
    public static native void bbf(Object[] objArr);

    public static native String dvg(int i);

    public static native String dvg2(Object obj, int i);

    public static native Object ez(Object obj, String str);

    public static native Object gp(Object obj, int i);

    public static native void ih2(Object obj, Object obj2, Object obj3, long j2);

    public static native Object kv1(String str, byte[] bArr, int i);

    public static native Object lv(String str, String str2);

    public static native Object oqs(String str, Object obj);

    public static native void py(Object obj, Object obj2, Object obj3, Object obj4, Object obj5);

    public static native void s2t(Object obj, Object obj2);

    public static native Object vqz(String str, String str2);

    public static native Object yk(Class cls);
}


그래서 실제적인 코드는 위 내용만 보고는 알 수 없습니다. 즉 위 함수들이 C 언어로 되어 있는데...

resources\lib\armeabi-v7a\libkc.so 여기 파일에 내용이 있습니다만, so파일은 disassemble 해도 보기가 어렵습니다.

so 파일은 ELF 로 되어있어서 https://onlinedisassembler.com/ 여기에 파일을 올리면 내용을 조금 볼 수 는 있지만 구체적으로 어떤 내용인지는 시간을 가지고 분석해봐야 합니다.


java 소스 코드도 전체적으로 확인해 보았지만 특별히 어떤 동작을 하는지 정확히 알 수는 없었습니다. native코드쪽을 더 파야하는데 확인하기가 쉽지 않아서 아쉽지만 여기에서 마쳐야 할것 같습니다.







2022년 2월 20일 일요일

Chrome, 조직에서 관리하는 브라우저? 해제법

갑자기 내가 사용하는 크롬 브라우저가 조직에서 관리하는 브라우저라고 나와서 당황한적이 있습니다.



조직에서 관리하는 브라우저란 학교, 회사 또는 기타 그룹에 의해 설정이 유지 관리되는 브라우저입니다. 해당 기능의 필요성은 회사나 학교에서 업무용 혹은 교육용 브라우저의 버전을 맞추거나 설정을 개인이 변경 못하기 위한 용도(?) 외에도 다양한 용도가 있습니다.

그런데 개인 PC가 조직에서 관리한다?? 뭔가 표현이 이상합니다. 오해를 불러일으키기 딱 좋습니다.

그렇다면 개인용 PC에서 해당 설정이 왜 어떻게 된 것인지 그리고 어떠한 방법으로 확인하는 것인지 알아보도록 하겠습니다.


브라우저 URL에 chrome://policy을 입력합니다.

위와 같은 항목 중 Chrome Policies 부분을 살표 봅니다. 뭔가 true 값이 있고 정책 이름이란 부분이 보입니다. 
사실 이 부분 때문에 조직에서 관리하는 브라우저가 된것입니다. 
저 값이 어떤 의미를 지니는지는 검색 해보면 알 수 있습니다.

그리고 실제 저장된 장소도 알 수 있는데... Windows registry 아래 위치에 저장이 되어 있습니다.

상세 내용은 아래 링크에서 알 수 있습니다.

Registry HiveHKEY_LOCAL_MACHINE or HKEY_CURRENT_USER
Registry PathSoftware\Policies\Google\Chrome
Value NameInsecurePrivateNetworkRequestsAllowed
Value TypeREG_DWORD
Enabled Value1
Disabled Value0

그런데 위 내용은 사람마다 다를 수 있고 다른 값일 수도 있습니다.


공통적인것은 레지스트리 편집기로 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome 여기를 접속해서 삭제해주면 됩니다. (InsecurePrivateNetworkRequestsAllowed 이 값 외에 다른 값이 있을 수 있지만, 대부분 비슷한 위치에 있습니다.)

regedit(레지스트리 편집기)를 실행시킵니다.


값이 보입니다. 
해당 부분을 삭제하면 됩니다. 삭제 후 F5(refresh) 해주시고, Chrome 재시작을 해주면 됩니다.

삭제하면 위와 같이 텅빈 상태가 됩니다.


크롬을 재시작 해주면 조직에서 관리하는 브라우저 정보가 사라집니다.



정리해보자면 어떤 SW가 해당 registry에 값을 쓴것으로 파악되나 정확하게는 알 수 없습니다. 여기에서는 해제하는 방법만 다루었고, 찾기 위해서는 registry 편집기를 띄워놓고 F5(refresh)해주면서 어떤 프로그램이 실행될때 값이 바뀌는지 추적해서 범인을 찾는 방법이 있겠습니다.


2022년 2월 13일 일요일

컴퓨터 느려짐, software_reporter_tool.exe 점유율 문제

오늘 글을 쓸려고 접속했던, PC가 갑자기 너무 느려져서 사용을 못할 상황이 었습니다. Trouble shooting 했던 내용입니다.


느리면 작업 관리자를 실행 시킵니다. (CTRL+ALT+DEL 메뉴의 제일 아래)


PC로 screenshot을 남기고 싶었지만 어떤 사유인지 동작이 안되는 상황이라 전화기로 남겼습니다.

검색해보니 software_reporter_tool.exe 이게 잘못된 프로그램은 아닌데... 

비정상적으로 CPU를 높게 점유하는 상황이 있나 봅니다.

Google Chrome Software Reporter 도구는 브라우저에서 오작동 또는 충돌하는 프로세스를 검색하고 Chrome 정리 도구의 일부입니다. Chrome 설정의 일부이므로 제어판에서 제거할 수 없습니다.

하지만 설병 변경만으로 개선이 되는 경우가 있습니다.

저는 chrome://settings/cleanup 에 기능중에 구글에 보고 하는 기능을 off 하고 재부팅 했더니 좋아졌습니다.



2021년 6월 12일 토요일

chatbot에서 git 소스 자동 업데이트


서버에서 직접 소스 작업하지 않는 경우도 있어서 다른PC에서 작업한 후 소스를 자동을 업데이트 하는 부분을 작성해봤습니다.

보통 console 로 접속해도 되지만 그것보다 챗봇을 이용하면 좀 더 편하게 처리가 가능합니다.

전체 코드는 간단한데 원리는 단순합니다. 

process의 exit 코드를 받아서 조건에 따라 다른 동작을 하도록 구현을 하는것입니다.

#!/bin/sh
while true; do
echo "start"
python3 code/main.py
if [ $? -eq 99 ]
then
echo "system update"
git pull
fi
if [ $? -eq 90 ]
then
echo "reboot"
fi
done


python3 code/main.py 이 부분은 main code를 실행시키는 부분입니다. 자신이 동작할 서버 프로그램을 넣으면 됩니다.

해당 process가 종료 될때 exit code가 if [ $? -eq 99 ] 99 이면 아래 조건을 만족해서 git의 pull 동작을 수행합니다.





그전에 git의 pw/id 를 입력하지 않도록 아래 링크를 이용하여 미리 입력해 둡니다.

https://git-scm.com/docs/git-credential-store


EXAMPLES

The point of this helper is to reduce the number of times you must type your username or password. For example:

$ git config credential.helper store
$ git push http://example.com/repo.git
Username: <type your username>
Password: <type your password>

[several days later]
$ git push http://example.com/repo.git
[your credentials are used automatically]












2020년 4월 12일 일요일

개발 방법론과 나름의 제안

아래 내용은 주관적인 의견임을 밝힙니다.



S/W개발에 있어 여러개발 방법론이 있어왔고, 앞으로도 있을 예정입니다. 그런데 내가 작업하는 방식이 뭔가에 대한 정체성 혼란이 올때가 있습니다. 흔희들 그것을 좋은 말로는 hybrid 방식 또는 기술을 받아 자신들의 방식에 접한해서 토착화 되었다고들 말합니다.

개발 방법론은 이론적이고 인간이 행해야 하는 행동들의 내용들도 포함되어있다보니, 막상 해보면 시간이 부족해지고 귀찮아 지기 때문에 해당 규칙을 따라하기가 상당히 까다롭고 행하다 보면 이렇게 안해도 될것 같은데 같은 생각이 들기 때문입니다.

결과물만 놓고 보면 어떤 개발 방법론을 사용한 것인지 알 수는 없습니다.  그렇기 때문에 과정상 편리한 점만 가져다 쓰는 형태를 많이 이용하게 됩니다. 특히 소규모 개발의 경우 이런 경우가 더더욱 빈번하며, 이것은 프로젝트를 엉뚱한 방향으로 가게 만드는 초석이 되기도 합니다.

그렇다면 개발 방법론을 처음부터 그대로 따라가야 하는걸까요? 원론적인 문제이지만, 가장 좋은건 시스템적으로 다른 방법이 없도록 만드는것 입니다. 사회주의 시스템의 통제와 비슷하다고 보는게 좋습니다. 개발 방법론은 아니지만 Python 언어의 들여 쓰기가 좋은 예가 될것 같습니다. 들여쓰기 규칙을 만족 하지 않으면 build 오류가 발생하는 시스템이라 들여 쓰기를 맞출수 밖에 없는 구조로 되어 있습니다.

여기에서 저도 새로운 개발 방법론을 제안 해보겠습니다. TDD와 비슷하면서도 조금 다른 개발 방법론을 제안 합니다.

TDD에서는 입력과 출력을 예상하여 testcase를 먼저 만드는 것에 촛점을 두고 있습니다. 제가 생각하는 방법은 여기에 입력과 출력 포함하여 실행 시간 측정 부분과 multi-thread에서 안전한지 등을 포함하여 좀 더 검사하는 항목이 많아지고, 이 함수를 만드는 coder들과 어떠한 함수가 필요한지와 함수의 시간 개념을 총괄하는 매니저를 분리하고 매니저가 coder들이 만든 함수들을 조합하는 개념입니다. coder들은 커다란 숲을 볼 수 없고 앞에 있는 나무만 보게 되고 최적화를 하게됩니다.

갑자기 이론적인 부분에 대해서 정리해보았습니다. 2020











2018년 1월 28일 일요일

구글 원격 데스트톱 사용 연결 방법

공유해 주는 쪽

1. 구글 크롬 다운로드 및 설치

https://www.google.com/chrome/browser/desktop/index.html


2. 크롬 실행


3. remote desktop 다운로드 및 설치

https://chrome.google.com/webstore/detail/chrome-remote-desktop/gbchcmhmhahfdphkhkmpfmihenigjmpp?hl=ko
오른쪽에 크롬에 추가 버튼을 눌러 설치합니다.



4. remote desktop 실행

크롬에 extension으로 설치되기 때문에 실행하려면 구글 첫 페이지에서 좌측 상단 앱 버튼으로 설치된 앱들 확인을 합니다.
아래와 같이 나오게 됩니다.
만약 위 화면이 나오게 하는게 어렵다면
직접 chrome://apps/ 아래 주소를 입력해도 됩니다. 


5. 내 컴퓨터 -> 시작하기 선택


위 화면에서 아래쪽 내 컴퓨터의 시작하기 버튼을 누릅니다.

6. 원격 연결 사용 버튼 누름

현재 PC인 경우 원격 연결 버튼이 있음
만약 현재 PC가 공유 설정이 안되어 있는 경우에만 나타납니다.


6. Client Host 프로그램 설치(자동으로 설치됨 최초 1회)


7. PIN(숫자) 비밀번호 입력



8. 절전 모드 안되도록 설정 필요


PC 제어판을 통해서 확인이 필요합니다.
(아래 화면에서는 설정 시간이 25분으로 되어있습니다. 없음으로 변경 필요 합니다.)
아래 설정 화면은 운영체제 마다 차이가 있습니다.



접속하는 쪽


1 ~ 5 동일


6. 내 컴퓨터 접속하고자 하는 PC를 누름

실행을 시키면 아래 화면과 같이 내 컴퓨터의 목록이 나오는데 밝은 파란색으로 보이는 PC가 접속 가능한 PC입니다. 접속 가능한 PC를 클릭 하면 됩니다.


7. PIN(숫자) 비밀번호 입력

공유할때 저장한 PIN번호를 입력하면 됩니다.



2016년 10월 2일 일요일

악어 장난감 입고정 안됨 분해 고장 수리기


얼마전 아이들이 악어 장난감을 구입하였는데 사용한지 하루만에 고장이 나고 말았습니다.
증상은 악어입을 벌려 놓으면 고정이 되어야 하는데 고정이 안되는 문제입니다.



<잘동작 될때의 악어 장남감 이빨을 누르면 랜덤으로 입이 내려옴>




 이유는 저기 보이는 조그마한 흰색 플라스틱이 원인이었습니다.
분해봤지만 도대체 어디서 빠진건지 알 수 없어서 고생을 했습니다.


<분해 사진>



포기하다시피 했지만 결국 찾아냈습니다.
아래 그림을 보면 조그마한 플라스틱의 위치를 알수 있습니다.
아래와 같이 꼽고 재 조립 후 정상 동작 ~~~


<위치를 찾아서 꼽은 후>

















2016년 6월 19일 일요일

c 언어 함수값 리턴을 하지 않는다면?

C언어상 함수의 리턴값을 넣지 않는다면 어떤값이 리턴될까?
Cpasted just now: 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>


int f1()
{
    return;
}


int main()
{
    printf("%d\n",f1());
    return 0;
}


Output:
1
0


간단하게 테스트 해봤는데... 결과는 0이 나왔습니다.
음 리턴을 안하면 0이 되는군.... 이렇게 결론 내릴 수 있을까요?
좀 더 복잡한 예제를 만들어 보았습니다.



복잡하게 사용한 예

Cpasted 1 second ago: 
#include <stdio.h>

int z;

int f1()
{
    return;
}

int f2(int a)
{
    int b = 10;
    a=b+10+a;
    z = a;
    return;
}

int main()
{
    printf("%d\n",f1());
    printf("%d\n",f2(1));
    return 0;
}


Output:
1
2
0
21



위 예제에서는 21이 나왔는데 21이 어떻게 나온건지... z값과 a값이 21일것 같은데... 그럼 뭐지 a값 그대로 넘겨주는건가 라고 생각 해볼 수 있어서 좀 더 테스트 해보았습니다.


#include <stdio.h>

int z;

int f1()
{
    return;
}

int f2(int a)
{
    int b = 10;
    a=b+10+a;
    z = a;
    return;
}

int f3(int a)
{
    return;
}

int main()
{
    printf("%d\n",f1());
    printf("%d\n",f2(1));
    printf("%d\n",f3(1));
    return 0;
}


Output:
1
2
3
0
21
0

이건 결론을 내리기 정말 애매한값이 됩니다.

Cpasted 1 second ago: 
#include <stdio.h>

int z;

int f1()
{
    return;
}

int f2(int a)
{
    int b = 10;
    a=b+10+a;
    z = a;
    return;
}

int f3(int a)
{
    z = a;
    return;
}

int main()
{
    printf("%d\n",f1());
    printf("%d\n",f2(1));
    printf("%d\n",f3(1));
    return 0;
}


Output:
1
2
3
0
21
1





위링크에서 c언어의 asm 변화된 부분만 보면 ret를 처리해서 return ret 해줄때 ret+=5 해주는 부분은 add eax, 5가 됩니다. 그리고는 pop 이 이루어 지므로 받는쪽에서는 eax 값을 리턴값으로 처리하게됩니다.
int callee(int, int, int);

int caller(void)
{
 int ret;

 ret = callee(1, 2, 3);
 ret += 5;
 return ret;
}
On x86, it will produce the following assembly code (Intel syntax):
caller:
 ; make new call frame
 push    ebp
 mov     ebp, esp
 ; push call arguments
 push    3
 push    2
 push    1
 ; call subroutine 'callee'
 call    callee
 ; remove arguments from frame
 add     esp, 12
 ; use subroutine result
 add     eax, 5
 ; restore old call frame
 pop     ebp
 ; return
 ret


결론은 리턴값을 안넘겨 주더라도 받는쪽에서 eax에 값을 넘겨 주는 방식으로 inline asm으로 작성해보았습니다.

링크 참고


#include <stdio.h>

int z;

int f1()
{
    return;
}

int f2(int a)
{
    int b = 10;
    a=b+10+a;
    z = a;
    return;
}

int f3(int a)
{
    z = a;
    asm("movl $5,%eax ");
    return;
}

int main()
{
    printf("%d\n",f1());
    printf("%d\n",f2(1));
    printf("%d\n",f3(1));
    return 0;
}


Output:
1
2
3
0
21
5

eax에 값5 를 리턴값으로 처리하고 있습니다. 
함수내에서 의도했던 하지 않았던 마지막 eax값을 리턴값으로 처리한다는 사실이 최종 결론 입니다. 
앗 그리고 이건 CPU나 C compiler등에 따라 달라질 수 있습니다.