CreateMutex
까보면 다나와~
유용한 지식 자료들/기타 (38)

Sudo pip install은 안돼요!

https://medium.com/@chullino/sudo-%EC%A0%88%EB%8C%80-%EC%93%B0%EC%A7%80-%EB%A7%88%EC%84%B8%EC%9A%94-8544aa3fb0e7

 

 

 

Sudo pip install은 안돼요!

안녕하세요. 개발자 Chullin입니다.

medium.com

 

TL; DR

  • pip 으로 패키지 설치할 때, sudo는 위험하니 절대 쓰지 맙시다.
  • 대신 가상환경 패키지 매니저를 설치하고 가상환경을 활용합시다.
  • pip 개발자도, 특권이 필요한 경로를 디폴트 경로로 설정한 것에 대해후회한다고 합니다.
  Comments,   0  Trackbacks
댓글 쓰기

Virustotal Enterprise.. not Enteprise

Virustotal Enterprise.. not Enteprise



어제?? 부로 Enterprise 사이트가 생겨나고 Intelligence가 서브 메뉴로 전환되었다.


https://www.virustotal.com/intelligence/

사이트 접근시 이제는 VT Enteprise(오타)라며 아래 사이트로 안내한다.ㅋ


https://www.virustotal.com/gui/



Enterprise.. 검색기능이 좋아진거 같다. 특히 유사한 파일을 검색해주는데 vhash를 이용하지 않았을까



  Comments,   0  Trackbacks
  • 애드웨어(광고창) 삭제 기능이 추가된 컴퓨터 무료 최적화 프로그램의 최강자 이지클린(EzClean)도 사용해보세요.


    네이버 자료실 :
    https://software.naver.com/software/summary.nhn?softwareId=GWS_003052&categoryId=B0600000

    이지클린 홈페이지 :
    http://www.ezclean.info
댓글 쓰기

시스템에서 가장 용량 많은 폴더 10개 뽑기


du -ah / | sort -n -r | head -n 10

  Comments,   0  Trackbacks
댓글 쓰기

Awesome Malware Analysis

https://github.com/rshipp/awesome-malware-analysis


keep)잘 정리된 URL

  Comments,   0  Trackbacks
댓글 쓰기

EPM Sandbox (IE)에 대한 글

#EPM이 뭔지

http://www.julien-manici.com/blog/ie10-new-sandbox-enhanced-protected-mode-windows-8/


#EPM 취약점

http://googleprojectzero.blogspot.co.uk/2014/12/internet-explorer-epm-sandbox-escape.html

  Comments,   0  Trackbacks
댓글 쓰기

리눅스 특정 사이즈 이상 폴더 삭제

ex) du -sk */ | awk 'BEGIN { FS="\t" }; { if($1 > 100000) printf "." $2 }' | xargs rm -rf


xargs rm -rf 대신 xargs du -sh로 폴더 용량 확인하고 삭제 하시길.


응용 : 폴더 depth를 2개까지로 한정하고 용량 범위를 지정하여 삭제

du -k 12*/ --max-depth=1 | awk 'BEGIN { FS="\t" }; { if($1 > 100000 && $1 < 2000000) printf "." $2 }' | xargs rm -rf


  Comments,   0  Trackbacks
댓글 쓰기

리눅스 폴더별 용량 확인하기

디렉토리를 용량순으로 표시하는 방법

원래 du 명령을 사용하면 14K > 12M로 표시되는 걸 다음과 같이 표시하는 방법이다.


ex) 현재 디렉토리 내 A, B, C 폴더, a, b, c 파일을 용량순으로 표시(M, K 이런식으로..)

12M A

9M  C

1M  B

14K b

10K a

0     c


du -ks * | sort -nr | cut -f2 | xargs -d '\n' du -sh


이런식으로 하면 됩니다.

-ks (block-size 1K & total size 1 depth)

-nr (numeric-sort & reverse) : r 주면 역순으로 재배치, 숫자에 따라 내림차순 또는 오름차순

xargs -d (delimiter) '\n' du -sh : 이건 du -sh를 엔터를 허용해서 표시

-sh는 사이즈를 인간이 보기편하게 보는 옵션


관련 포스트

http://arisri.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-du-%EB%AA%85%EB%A0%B9%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EC%9A%A9%EB%9F%89-%ED%99%95%EC%9D%B8-%EC%9D%91%EC%9A%A9

'유용한 지식 자료들 > 기타' 카테고리의 다른 글

EPM Sandbox (IE)에 대한 글  (0) 2015.01.13
리눅스 특정 사이즈 이상 폴더 삭제  (0) 2014.12.22
리눅스 폴더별 용량 확인하기  (0) 2014.12.22
Indoor positioning system  (0) 2014.09.23
HashSet HashMap 차이 정리  (0) 2014.08.07
MFC 리버싱하기  (0) 2013.08.12
  Comments,   0  Trackbacks
댓글 쓰기

Indoor positioning system

http://en.wikipedia.org/wiki/Indoor_positioning_system


실내 및 근거리 내 위치를 찾아내는 시스템들....


wifi 수신감도를 3차원으로 해석할 수 있으면 삼각측량법이 아니여도

위치의 정확도를 높일 수 있지 않을까

'유용한 지식 자료들 > 기타' 카테고리의 다른 글

리눅스 특정 사이즈 이상 폴더 삭제  (0) 2014.12.22
리눅스 폴더별 용량 확인하기  (0) 2014.12.22
Indoor positioning system  (0) 2014.09.23
HashSet HashMap 차이 정리  (0) 2014.08.07
MFC 리버싱하기  (0) 2013.08.12
Decompilers  (0) 2013.08.12
  Comments,   0  Trackbacks
댓글 쓰기

HashSet HashMap 차이 정리

Set과 Map은 저장된 방식의 차이다. 둘다 순서는 없다.

 

HashSet : {1, 2, 3, 4, 5}

HashMap : {a->1, b->2, c->2, d, ->1}

 

HashMap은 중복 데이터 허용, HashSet는 불허용

 

HashSet은 키가 곧 데이터이고 HashMap은 키값이 지정됨(??). 둘다 인덱싱을 하지 않지만 데이터를 찾아가는 방식이 차이가 있음.

 

그리고 Set은 그냥 집합임(Set이 한글로 집합)

'유용한 지식 자료들 > 기타' 카테고리의 다른 글

리눅스 폴더별 용량 확인하기  (0) 2014.12.22
Indoor positioning system  (0) 2014.09.23
HashSet HashMap 차이 정리  (0) 2014.08.07
MFC 리버싱하기  (0) 2013.08.12
Decompilers  (0) 2013.08.12
virtualbox-host-only-network-cuckoo-sandbox-0-4-2/  (0) 2013.07.29
  Comments,   0  Trackbacks
댓글 쓰기

MFC 리버싱하기

MFC 리버싱하기


요약
AfxWinMain
- AfxGetModuleThreadState
- AfxGetModuleState
- AfxWinInit
- CWinApp::InitApplication (?InitApplication@CWinApp@@UAEHXZ)
 - call dword ptr [eax+58h], that is pThread->InitInstance (main code)
call    ?DoModal@CDialog@@UAEHXZ ; CDialog::DoModal(void)
DoModal 콜하기 바로 전에 mov [esi], eax 또는 mov [esi+20], eax 이런 어셈코드가 있는데 eax + 30  이것이 MessageMap entry를 호출하는 GetMessageMap Function

자세한 설명은 아래.

good~!!

http://quequero.org/2008/08/guidelines-to-mfc-reversing/

Guidelines to MFC Reversing

Software developed with MFC may import MFC80U.dll (MFC80U is the name of the last version of the dll, as I’m writing), it depends on the type of compilation: as a static library or as a shared DLL.
I’ll analyze a software which imports the dll and has debug infos, just to make the job easier.
Once you understand MFC in this way, you can analyze MFC software compiled statically just adding to IDA the signatures of MFC and VisualC.

 

Prologue: What is MFC?

The Microsoft Foundation Classes Library (also Microsoft Foundation Classes or MFC) is a library that wraps portions of the Windows API in C++ classes, including functionality that allows to use a default application framework. Classes are defined for many of the handle-managed Windows objects and also for predefined windows and common controls.

 

Tools – References

IDA
Reversing Microsoft Visual C++ Part II: Classes, Methods and RTTI
Crackme

 

Essay

This is a standard C source code for windows:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LRESULT CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        switch(uMsg)
        {
        case WM_COMMAND:
                switch(LOWORD(wParam))
                {
 
                case IDC_ABOUT:
                        DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)MainDialogProc, 0);
                        break;
 
                        // ...
                }
        }
}

Instead this is source code that uses MFC:

class CAboutDlg : public CDialog
{
public:
        CAboutDlg();
 
// Dialog Data
        enum { IDD = IDD_ABOUTBOX };
 
protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
 
// Implementation
protected:
        DECLARE_MESSAGE_MAP()
};
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)  //CAboutDlg::IDD is dialog ID         
{
}
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
}
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //Dialog Message Map: is like DialogProc
END_MESSAGE_MAP()
 
// App command to run the dialog
void CProvaRevApp::OnAppAbout()
{
        CAboutDlg aboutDlg;
        aboutDlg.DoModal();
}

How you can imagine the disasm of MFC software is harder to understand.

MFC Main

This is the Main disasm of our target:

.text:00401CBB                 public start
.text:00401CBB                 call    ___security_init_cookie
.text:00401CC0                 jmp     ___tmainCRTStartup
 
.text:004019FB ___tmainCRTStartup proc near           ; CODE XREF: start+5�j
.text:004019FB
.text:004019FB                 push    5Ch
.text:004019FD                 push    offset unk_403DD8
.text:00401A02                 call    __SEH_prolog4
;... other initialization code
.text:00401B3E                 push    ecx            ; nShowCmd
.text:00401B3F                 push    eax            ; lpCmdLine
.text:00401B40                 push    ebx            ; hPrevInstance
.text:00401B41                 push    400000h        ; hInstance
.text:00401B46                 call    _wWinMain@16   ; wWinMain(x,x,x,x)
 
; int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)
_wWinMain@16 proc near
        jmp     ?AfxWinMain@@YGHPAUHINSTANCE__@@0PA_WH@Z ; AfxWinMain(HINSTANCE__ *,HINSTANCE__ *,wchar_t *,int)
_wWinMain@16 endp

As you can see WinMain calls AfxWinMain.
If you have VisualStudio you can see MFC source code, in this article I’ll report only the functions we’ll need.

int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        _In_ LPTSTR lpCmdLine, int nCmdShow)
{
        ASSERT(hPrevInstance == NULL);
 
        int nReturnCode = -1;
        CWinThread* pThread = AfxGetThread();
        CWinApp* pApp = AfxGetApp();
 
        // AFX internal initialization
        if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
                goto InitFailure;
 
        // App global initializations (rare)
        if (pApp != NULL && !pApp->InitApplication())
                goto InitFailure;
 
        // Perform specific initializations
        if (!pThread->InitInstance())
        {
                if (pThread->m_pMainWnd != NULL)
                {
                        TRACE(traceAppMsg, 0, "Warning: Destroying non-NULL m_pMainWnd\n");
                        pThread->m_pMainWnd->DestroyWindow();
                }
                nReturnCode = pThread->ExitInstance();
                goto InitFailure;
        }
        nReturnCode = pThread->Run();
 
InitFailure:
        AfxWinTerm();
        return nReturnCode;
}

This is the disasm of AfxWinMain:

.text:7831D2D2                 public AfxWinMain
.text:7831D2D2 AfxWinMain      proc near
.text:7831D2D2                 push    ebx
.text:7831D2D3                 push    esi
.text:7831D2D4                 push    edi
.text:7831D2D5                 or      ebx, 0FFFFFFFFh
.text:7831D2D8                 call    AfxGetModuleThreadState
.text:7831D2DD                 mov     esi, [eax+4] ;pThread
.text:7831D2E0                 call    AfxGetModuleState
.text:7831D2E5                 push    [esp+0Ch+arg_C]
.text:7831D2E9                 mov     edi, [eax+4] ;pApp
.text:7831D2EC                 push    [esp+10h+arg_8]
.text:7831D2F0                 push    [esp+14h+arg_4]
.text:7831D2F4                 push    [esp+18h+arg_0]
.text:7831D2F8                 call    AfxWinInit
.text:7831D2FD                 test    eax, eax
.text:7831D2FF                 jz      short loc_7831D33D
.text:7831D301                 test    edi, edi   
.text:7831D303                 jz      short loc_7831D313
.text:7831D305                 mov     eax, [edi]
.text:7831D307                 mov     ecx, edi
.text:7831D309                 call    dword ptr [eax+98h]
.text:7831D30F                 test    eax, eax
.text:7831D311                 jz      short loc_7831D33D
.text:7831D313
.text:7831D313 loc_7831D313:
.text:7831D313                 mov     eax, [esi]
.text:7831D315                 mov     ecx, esi
.text:7831D317                 call    dword ptr [eax+58h]
.text:7831D31A                 test    eax, eax
.text:7831D31C                 jnz     short loc_7831D334
.text:7831D31E                 cmp     [esi+20h], eax
.text:7831D321                 jz      short loc_7831D32B
.text:7831D323                 mov     ecx, [esi+20h]
.text:7831D326                 mov     eax, [ecx]
.text:7831D328                 call    dword ptr [eax+68h]
.text:7831D32B
.text:7831D32B loc_7831D32B:
.text:7831D32B                 mov     eax, [esi]
.text:7831D32D                 mov     ecx, esi
.text:7831D32F                 call    dword ptr [eax+70h]
.text:7831D332                 jmp     short loc_7831D33B
.text:7831D334
.text:7831D334 loc_7831D334:
.text:7831D334                 mov     eax, [esi]
.text:7831D336                 mov     ecx, esi
.text:7831D338                 call    dword ptr [eax+5Ch]
.text:7831D33B
.text:7831D33B loc_7831D33B
.text:7831D33B                 mov     ebx, eax
.text:7831D33D
.text:7831D33D loc_7831D33D:
.text:7831D33D                 call    AfxWinTerm
.text:7831D342                 pop     edi
.text:7831D343                 pop     esi
.text:7831D344                 mov     eax, ebx
.text:7831D346                 pop     ebx
.text:7831D347                 retn    10h
.text:7831D347 AfxWinMain      endp

In the code there are calls as call [eax+XXh]: actually the call to AfxGetApp (and AfxGetThread) gives back a pointer to a structure that has offsets of all functions used by MFC framework.
In this case edi (pApp) holds the offset of 405498, which value is 40349C VA, where the virtual functions table of CWinApp is stored:

.rdata:0040349C off_40349C      dd offset ?GetRuntimeClass@CWinApp@@UBEPAUCRuntimeClass@@XZ;CWinApp::GetRuntimeClass(void)
.rdata:004034A0                 dd offset sub_401010
.rdata:004034A4                 dd offset nullsub_1
.rdata:004034A8                 dd offset nullsub_2
.rdata:004034AC                 dd offset nullsub_1
.rdata:004034B0                 dd offset ?OnCmdMsg@CCmdTarget@@UAEHIHPAXPAUAFX_CMDHANDLERINFO@@@Z ; CCmdTarget::OnCmdMsg(uint,int,void *,AFX_CMDHANDLERINFO *)
.rdata:004034B4                 dd offset ?OnFinalRelease@CCmdTarget@@UAEXXZ ; CCmdTarget::OnFinalRelease(void)
.rdata:004034B8                 dd offset ?IsInvokeAllowed@CCmdTarget@@UAEHJ@Z ; CCmdTarget::IsInvokeAllowed(long)
.rdata:004034BC                 dd offset ?GetDispatchIID@CCmdTarget@@UAEHPAU_GUID@@@Z ; CCmdTarget::GetDispatchIID(_GUID *)
.rdata:004034C0                 dd offset ?GetTypeInfoCount@CCmdTarget@@UAEIXZ ; CCmdTarget::GetTypeInfoCount(void)
.rdata:004034C4                 dd offset ?GetTypeLibCache@CCmdTarget@@UAEPAVCTypeLibCache@@XZ ; CCmdTarget::GetTypeLibCache(void)
.rdata:004034C8                 dd offset ?GetTypeLib@CCmdTarget@@UAEJKPAPAUITypeLib@@@Z ; CCmdTarget::GetTypeLib(ulong,ITypeLib * *)
.rdata:004034CC                 dd offset sub_401000
;.......................................................

Now a question should pop up in your mind: where does MFC get the address? A quick glance at the reference with IDA…

.text:004023B0 sub_4023B0      proc near             
.text:004023B0                 push    0
.text:004023B2                 mov     ecx, offset dword_405498
.text:004023B7                 call    ??0CWinApp@@QAE@PB_W@Z ; CWinApp::CWinApp(wchar_t const *)
.text:004023BC                 push    offset sub_4023F0 ; void (__cdecl *)()
.text:004023C1                 mov     dword_405498, offset off_40349C ;<-- this is our offset
.text:004023CB                 call    _atexit
.text:004023D0                 pop     ecx
.text:004023D1                 retn
.text:004023D1 sub_4023B0      endp

This VA, 004023B0, is present in a structure

1
2
3
4
5
6
7
.rdata:00403304 unk_403304      db