목적:
vi(vim)으로 소스 코딩 작업을 할 때 효율을 높여주기 위해 사용하는 ctags에 관한 사용법 및 팁

설치:
일반적으로 최신 linux 계열에는 기본적으로 설치되어 있음. 
만약 설치되어 있지 않다면  http://ctags.sourceforge.net  에서 받으면 된다. 

사용:
tag 파일을 만들기 위해서는 먼저 tag 파일을 만들고자 하는 파일 경로로 이동한 다음 다음 명령 실행

#ctags -R *  


-R 옵션은 하위 디렉토리에 있는 소스 파일 까지 모두 tag에 포함 시키겠다는 명령어이다.  

만약 현재 디렉토리에 있는 파일만 tag에 포함시키겠다면  -R을 빼고 실행하면 된다. 

팁:
만약  tag를 만든 위치가 아닌 하위 디렉토리에서 소스를 열면 미리 생성해둔 tags를 사용할 수 없다.
그렇다고 소스를 항상 상위 디렉토리에서만 연다는 것도 뭔가 불편하다.
그럴때는 vimrc에 추가하는 것도 한 방법이 될 수 있다.

$ vim ~/.vimrc


파일에 다음 내용을 추가한다. 

set tags=./tags,/home/kyungtae/test_src/tags


이 말인즉슨, 현재 폴더의 tags를 상위 디렉토리의 tags 파일을 가져다 쓰겠다는 것이죠.
(참고로, tag파일은 tags라는 이름으로 생성됩니다.)

여기서 주의해야 할 것은.. 
경로(파란색으로 칠한 부분)는 절대경로로 해주어야 합니다. 

Posted by KT한
,
목적:
gdb를 활용해서 바이너리 파일을 실행하는게 번거로울때
segment fault가 발생하면 자동으로 core file이 생성되도록 설정


절차:

1. ulimit -a 로 조회

core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31160
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited


2. ulimit -c 로 core file size를 설정
얼마나 큰 파일이 생성될지 모르기 때문에 unlimited 으로 설정

#ulimit -c unlimited

3. 바이너리를 실행하다가 segment fault가 발생하면..
core파일이 생성됐는지 확인!
core.xxxx 처럼 뒤에 숫자가 붙어있다.

# ll -t
-rw------- 1 root root 764497920 Jun 20 08:20 core.19018

4. core파일을 gdb로 열어서 확인
실행 해보면 어떤 바이너리를 실행한 core 파일인지 확인 가능
# gdb -c core.19018
GNU gdb (GDB) Fedora (7.0.1-50.fc12)
Copyright (C) 2009 Free Software Foundation, Inc.

... 중략 ...

Core was generated by `test_coredump'.

... 중략 ...
#0  0x0000003a606327f5 in ?? ()
(gdb)

5. 바이너리 파일을 지정 해준 후 core파일을 열어서 디버깅 시작

# gdb -c core.32258 ./test_coredump


6. ulimit -c 로 core file size 원복
계속해서 core 파일을 생성하면 불필요한 하드 공간을 차지하게 되므로..
검증작업이 끝났다면 core file 크기를 원복 시켜주는게 좋습니다. 

#ulimit -c 0

 ※ gdb 활용법은 아래 포스팅을 참고하세요~
http://kthan.tistory.com/6


Posted by KT한
,
목적:
- pcap파일을 전송(재생)하는 목적으로 사용
- 공격 패킷이나 다량의 트래픽을 발생 시키는 목적으로 사용 가능
- 세션이나 비정상 패킷에 대한 테스트 목적으로 사용 가능

사실 여기서 소개할 툴 모두 기능이나 사용방법이 매우 유사합니다.
그냥 기호에 맞는 툴을 선택해서 사용하시면 될것 같네요.

※ 32bit 장비에서 컴파일한 바이너리를 첨부했습니다.
혹시 별도의 설치 없이 사용하고 싶다면..
/usr/bin 아래 폴더에 넣어서 사용하시면 됩니다.

1. tomahawk
장점
- MAC 주소를 pcap에 저장된 값이 아닌 실행하는 장비의 실제 MAC주소로 변환해서 전송 

주요 옵션
-h   사용법 출력 (헬프 메뉴)
-i     패킷 전송(수신) 인터페이스 설정
-j     패킷 수신(전송) 인터페이스 설정
-f     전송할 pcap파일 설정
-l     반복 횟수 설정
-r     재전송 횟수 설정


사용 방법 예
tomahawk -i eth1 -j eth2 -f test.pcap

전송되는 패킷
Beginning test

10:46:56.976963 00:90:0b:0e:76:2d (oui Unknown) > 00:90:0b:0e:76:2a (oui Unknown), ethertype IPv4 (0x0800), length 62: 65.15.1.2.http > 192.15.1.1.light: Flags [S.], seq 3366950201, ack 3958126482, win 16384, options [mss 1380,nop,nop,sackOK], length 0

Finished 2 loops of trace test.pcap Completed: 10, Timed out: 2
Retrans: 0
Sent: 10
Recv: 10

다운 로드 사이트
http://tomahawk.sourceforge.net/

바이너리 첨부파일 다운 ↓↓↓↓↓↓

tomahawk


2. tcpreplay
장점
- 전송 속도/개수에 관한 옵션이 다양

주요 옵션
-h               사용법 출력 (헬프 메뉴)
--listnics   사용 가능한 인터페이스 출력
-i               패킷 전송 인터페이스 설정
-j               패킷 전송 인터페이스 설정
-v              전송하는 패킷 정보 출력
-l               반복 횟수 설정
-p              패킷 전송 pps 설정
-t               가능한 빨리 전송       


사용 방법 예
tcpreplay -i eth1 test.pcap -v

전송되는 패킷
sending out eth1
processing file: test.pcap

11:20:56.689024 00:19:db:43:62:07 (oui Unknown) > 00:13:77:c8:48:2d (oui Unknown), ethertype IPv4 (0x0800), length 60: 192.4.10.8.32064 > 192.4.10.41.61553: Flags [F.], seq 1729, ack 1, win 46, length 0

Actual: 38 packets (4259 bytes) sent in 2.90 seconds
Rated: 1468.6 bps, 0.01 Mbps, 13.10 pps

다운 로드 사이트
http://tcpreplay.synfin.net/

바이너리 첨부파일 다운 ↓↓↓↓↓↓

tcpreplay


3. bit-twist
장점
- 패키지에 포함되어 있는 "bittwiste" 를 사용해서 특정 패킷을 조작 가능(여기서 bittwiste에 대한 설명은 다루지 않겠습니다.)

주요 옵션
-h   사용법 출력 (헬프 메뉴)
-d    사용 가능한 인터페이스 정보 조회
-i     패킷을 전송할 인터페이스 설정
-l     반복 횟수 설정
-m   전송 하는 패킷 간 간격 설정. 0으로 설정하면 즉시 전송.
-v    전송하는 패킷의 시간 정보 출력

사용 방법  예
bittwist -v -i eth1 test.pcap

전송되는 패킷 예
sending packets through eth1
trace file: test.pcap

11:19:22.737028 00:19:db:43:62:07 (oui Unknown) > 00:13:77:c8:48:2d (oui Unknown), ethertype IPv4 (0x0800), length 322: 192.4.10.8.32064 > 192.4.10.41.61553: Flags [P.], seq 1461:1729, ack 1, win 46, length 268

37 packets (4185 bytes) sent
Elapsed time = 1.197193 seconds

다운 로드 사이트
http://bittwist.sourceforge.net/

바이너리 첨부파일 다운 ↓↓↓↓↓↓
bittwist


Posted by KT한
,

목적: 일정 시간에 시계의 알람처럼 특정 프로그램을 실행하고자 할때 사용
바이러스 체크 프로그램처럼 사용자가 지정한 시간(시스템 부하가 적은)에 동작시키는 목적으로 주로 사용된다. 

설정 형식:

# .---------------- 분 (0 - 59)
# |  .------------- 시 (0 - 23)
# |  |  .----------  일 (1 - 31)
# |  |  |  .-------  월 (1 - 12) 
# |  |  |  |  .----   주 (0 - 7) (0과 7=일요일, 1=월요일, 2=화요일, 3=수요일, 4=목요일, 5=금요일, 6=토요일 
# |  |  |  |  |
   *  *  *  *  * 실행할 명령(프로그램)


시간 표현 형식:

1. 특정 값: 숫자로 표현                      (예:  30   2   *   *   7  명령어  =>  매주 일요일 새벽 2시 30분에 실행 )
2. 여러 값: 콤마로 구분하여 표현         (예:  10,30,50   *   *   *   *  명령어 =>  매 10, 30, 50분 마다 실행 )
3. 범위 값: 하이픈으로 구분하여 표현   (예:  0   1-3   *   *   *  명령어 =>  매일 1, 2, 3시에 실행 )
4. 시간 간격: 슬래시로 구분하여 표현   (예:  1  */5   *    *   *  명령어 =>  매일 5시간 간격으로 1분에 실행 )
5. 모든 값: 별표로 구분하여 표현         (예:  *   *   *   *   *  명령어 => 매분 마다 실행 )




사용 절차:
1. crontab 편집모드 실행. 
 [root@localhost ~]# crontab -e

2. 편집창에 원하는 주기와 실행 명령어를 등록한다.
# 분               시          일          월           주      명령어 
   30               1           *            *             *       sh /root/backup.sh 

3. 저장하고 나와서 제대로 등록됐는지 확인 
 [root@localhost ~]# crontab -l

참 쉽죠?



자주 사용되는 설정 :
 

1.  일,월,화 요일 새벽 2시 10분에 백업 실행 
 ▷10 2 * * 0-2   /root/backup.sh 
 

2.  1시에서 6시 사이에 2시간 마다 30분에 실행 
 ▷ 30  1-6/2   *   *   *  
 

3. 매달 1일 1시에 실행 
 ▷ 0  1   1   *   *   

4. 매 15분 마다 실행
 ▷ */4 *  *  *   *   




 
Posted by KT한
,

목적:

1. 실행파일을 gdb로 실행하면서 디버깅

# gdb [프로그램명]



2. 현재 실행중인 프로그램이 문제가 있는데.. 종료시키지 않고 디버깅 하고 싶다면..

attach 명령어를 사용해서 디버깅

먼저 디버깅할 프로세스의 PID를 구한다. 


#ps aux | grep [프로그램명]
root      4037  1.6  9.7 1909612 388600 ?      Ssl  Sep23 123:31 ./test_program

# gdb 

..중략..

(gdb) attach 4037


3. core파일을 디버깅

core파일을 생성하는 방법은 여러가지가 있는데요. 



3.1. gcore를 활용해서 core dump파일을 생성한 후 디버깅

#gdb -c [core파일명] [프로그램명] ,또는
#gdb [프로그램명][core파일명]

※ core dump 파일 만드는 방법은 단순히 gcore뒤에 core 파일을 만들 pid만 넣어주면 된다.

#gcore [-o filename] <pid>


3.2. gdb로 core파일을 생성하고 싶은 프로세스를 attach한 후 core dump파일 생성


(gdb) attach <pid>

(gdb) generate-core-file

Saved corefile core.<pid>


3.3. 실행중 segfault를 발생시키고 종료된 프로그램이 생성한 core파일이 있다면.. 


#gdb [프로그램명] [실행중인프로세스pid]


※ segfault 발생했을 때 core dump파일을 생성하도록 설정 하는 방법은 다음 포스트를 참조
http://kthan.tistory.com/45


 절차:

※ 컴파일시 -g 옵션을 사용해야 합니다. 


현재 위치에서 수행 가능한 명령어는 <tab>키를 누르면 조회됩니다. 

#gdb <binary>  

gdb를 실행하면 아래와 같은 프롬프트 화면이 나온다
(gdb)

"run"을 입력하면 프로그램이 실행된다.
만약 프로그램을 실행하는데 특정 옵션이 필요하다면 이곳에서 지정해줄 수 있다.
(gdb) run "--read /home/kthan/test.txt"
 

1. 프로그램이 비정상적으로 종료 되었다면..
스택을 보기 위해 bt(backtrace) 명령어를 사용한다. 현재 활성화된 서브루틴의 스택 프레임을 출력해준다.

 (gdb) bt

#0 Check (p=0x7fff9ffe3d10, lwssn=0x11b6bc20,
sPolicy=<value optimized out>, skey=<value optimized out>,    isnew=<value optimized out>) at stream.c:6858#1  Process (p=0x7fff9ffe3d10, lwssn=0x11b6bc20,

이런식으로 볼 수 있다. 
여기 나온 위치 값을 가지고 문제가 되는 소스의 위치를 알 수 있다. 


2. breaking point를 설정해서 원하는 만큼씩 실행하고 싶다면..실행하기 전에 먼저 breaking point를 설정한다. 

- func 함수의 시작위치에 설정
(gdb) b func 

-123번째 줄에 설정
(gdb) b 123   

-main.c 파일의 func 함수의 시작 위치에 설정
(gdb) b main.c:func 




설정한 breaking point는 "info b" 명령어로 조회 가능하다.

Num     Type      Disp Enb Address                                                         What

1       breakpoint     keep  y   0x0000000000444390 in SetupCompare at spo_check.c:178     breakpoint already hit 1 time
2       breakpoint     keep   y   0x0000000000441f80 in Setup    at spo_fast.c:116
3       breakpoint      keep  y   0x00000000004427c0 in Setup  at spo_full.c:99

Num: breakpoint의 고유번호
Type: breakpoint/watchpoint/catchpoint 정보
Disp: breakpoint의 특징
Enb: 현재 해당 breakpoint의 활성화 여부, 활성화/비활성화는 'enable br [Num]' 또는 'disable br [Num]'으로 변경가능


3. 원하는 원하는 만큼 위치를 옮겨가며 디버깅을 수행한다.

s(step) <반복횟수>  : 현재 출력된 행을 수행하고 멈추지만, 함수의 경우 함수의 내부로 들어가서 수행된다
 n(next)  : 현재 행을 수행하고 멈추지만, 함수의 경우 함수를 수행하고 넘어간다
 c(continue)  : 다음 브레이크 포인트를 만날때 까지 계속 수행한다
 u(until)  : for 문에서 빠져나와서 다음 브레이크 포인트까지 수행한다.
 finish : 현재 함수를 수행하고 빠져나감
 return : 현재 함수를 수행하지 않고 빠져나감
 return 123 : 현재 함수를 수행하지 않고 빠져나감, 단, 리턴값은 123
 si(step instruction)  : 현재의 인스트럭션을 수행, 함수 호출 시 내부로 들어간다.
 ni(next instruction)  : 현재의 인스트럭션을 수행, 함수 호출 시 내부로 들어가지 않는다.


4. 확인 해보고자 하는 값을 출력해가며 디버깅 수행

p(print) 변수 명 : 설정한 변수가 현재 가지고 있는 값을 출력
p *구조체 : 구조체의 값 출력

5. 종료
(gdb) quit


※gdb에 관한 고급 명령어는 다음 포스팅을 참고하세요.

 http://kthan.tistory.com/57

Posted by KT한
,

첫술에 배부르기를 기대하지 말고 단계 별로 차근차근 따라하면 

금방 vim을 자유자재로 사용할 수 있게 될겁니다. ^^  

Setp 1

기본 명령

내용입력모드로 진입 i
명령줄모드 :
명령모드로 진입 ESC
종료 :q
저장 :w
저장하고 종료 :wq 또는 :x
커서이동 h
l
k
j
한 단어 이동 w
공백으로 분리된 한 단어 이동 W
한 단어 뒤로 이동 b
공백으로 분리된 한 단어 뒤로 이동 B
문서 맨 끝 G
문서 맨 처음 gg

 선택된 문자 끝 

gn 

N번째 라인 :N
예) ":100", ":1"
지우기 한 글자 지우기 x
한 줄 지우기 dd
한 단어 지우기 dw
한 글자 지우고 입력모드로 전환 s
한 줄 지우고 입력모드로 전환 S

Setp 2

환경설정

기능 명령
tag 만들기 $ ctags -R .
$ cscope -Rbq

vim : 명령

일반

기능 명령
HELP 보기 :help

소스코드 추적

기능 명령
function call 따라가기 Ctrl-]
:cs find g <func_name>
function call 돌아오기 Ctrl-t
function reference 찾기 :cs find s <func_name>

Setp 3

환경설정

기능 명령
초기설정용 스크립트 파일 ~/.vimrc
tabstop :set ts=4
shiftwidth :set sw=4
auto indent :set ai
C style indent :set cin
background :set background=light|dark

vim 명령

일반

기능 명령
스크롤 한화면 Ctrl+f
Ctrl+b
화면절반 Ctrl+d
Ctrl+u
커서 이동 맨위 H
가운데 M
맨아래 L

Setp 4

화면분할

기능 명령
윈도우 상하분리 :split 또는 :sp
Ctrl+w s
좌우분리 :vsplit 또는 :vsp
Ctrl+w v
창 닫기 :q 또는 Ctrl+w q 또는 c
현재 커서가 있는 창 빼고 다 닫기 Ctrl+w o
윈도우간 커서 이동 Ctrl+w h,j,k,l
윈도우 위치이동 Ctrl+w H,J,K,L
창 크기 조절 Ctrl+ w [숫자] > 또는 < (숫자 만큼 창 크기 조절)
(옵션)멀티윈도우로 실행

-O2(수직분할), -o2(수평분할)

예) # vim -O2 main.c test.c 

모두저장 :wa
모두 종료 :qa

Setp 5

편집

기능 명령
자리표시/기억

m[a-z]
'm' 뒤에 누르는 키 이름으로 마킹 해둠. 

표시한 자리로 이동 '[a-z]
위에서 마킹한 키를 누르면 해당 위치로 이동함.
현재위치에서 위치 a 까지 지우기 d'a
현재위치에서 위치 a 까지 복사 y'a
화면스크롤 커서의 위치가 맨위로 가도록 z<CR>
커서의 위치가 가운데 zz
커서의 위치가 맨아래 z-
화면접기
편집명령아님.
화면만 변경
접기 zf<커서이동명령>
예: zf20j, zf%, zf'a
접은 화면 풀기 zo

Setp 6

편집

기능 명령
명령행에 붙이기 y...으로 복사한 다음 명령행에서 Ctrl+r[0-9]
예제:cs find s Ctrl+r 0
함수 자동 완성 함수명 일부 입력 후 Ctrl + n 또는 Ctrl + p
찾기 / 다음에 regex 사용 가능
커서자리의 스트링 찾기 아래방향 #
윗방향 *
바꾸기 커서있는 줄  :s/찾는문자열/바꿀문자열/g
마지막에 g는 두 개 이상 바꿀 때
문서전체 :%s/찾는문자열/바꿀문자열/g
참조: %대신 ^.,나 .,$
특정 위치 :10,20s/찾는문자열/바꿀문자열/g
참조: 10~20번째 줄에서만 찾아서 치환
한줄씩 스크롤 아래방향 Ctrl+e
윗방향 Ctrl+y

Setp 7

통합개발환경

기능 명령
빌드 :make
grep :grep ...
결과를 표시 :cl
특정 결과로 커서 이동 :cc번호
다음 결과로 커서 이동 :cn
이전 결과로 커서 이동 :cN
명령결과를 별도 창에 표시 :cw
명령결과창에 있는 내용으로 이동 커서 이동후 Enter


Posted by KT한
,
  • 목적: 

addr2line 은 바이너리 파일이 segfault를 내며 죽어버렸을 때 코드의 어떤 부분이 문제가 되는것인지 

찾을 때 유용하다.

사용하는 입장에서는 gdb와 유사하다고 볼 수 있는데.. gdb는 실행 전에 걸어야 한다는 점이 다르다고 볼 수 있다. 



  • 사용 절차:

1. 먼저 segfault가 난 상황이 발생하게 되면 .. 

2. segment fault가 발생한 시점을 찾아서 그 주소값을 복사한다 

$ ./test(_Z13segment_faultv+0×14) [0x400b64

$ ./test(main+0x2f) [0x400c2f]


3. #addr2line <주소> -fe <binary> 

ex) addr2line 400b64 -fe test


4. 결과로 출력된 위치로 이동해서 문제점을 찾는다.


Posted by KT한
,

1. 목적:  현재 시스템 상태정보를 보여준다.

2. 사용방법:
사용 가능한 명령어 리스트를 보고 싶다면 소문자 'h'를 눌러보자 

top - 16:53:50 up 45 days,  8:09, 22 users,  load average: 0.00, 0.00, 0.00
Tasks: 399 total,   1 running, 398 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.1%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  12324804k total, 11996880k used,   327924k free,  2179864k buffers
Swap: 10289144k total,    82448k used, 10206696k free,  7375768k cached

▷ 이때 숫자 '1'을 누르면 전체 CPU에 대한 정보가 보여진다.
top - 16:55:44 up 45 days,  8:11, 22 users,  load average: 0.00, 0.00, 0.00
Tasks: 399 total,   1 running, 398 sleeping,   0 stopped,   0 zombie
Cpu0  :  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

▷정렬 기준을 변경하고 싶다면 '<' 와 '>'키를 누르면 가능하다 

기본적으로 CPU사용률을 기준으로 정렬되어 있으며, 

'>'를 한 번 누르면 메모리 사용률을 기준으로 정렬이 된다. 



▷ 자주 사용하는 유용한 단축 키들 

H : thread별로 펼쳐서 정보를 보여준다.

N : PID로 정렬해서 보여준다. (numerically).

P : CPU사용률로 정렬해서 보여준다. (default).

M : 메모리 사용률로 정렬해서 보여준다. 

T : 실행 시간 순으로 정렬해서 보여준다.



▷화면에 보여지는 값들을 변경하고 싶다면 'f'를 눌러 설정하고자 하는 메뉴의 단축키를 눌러주면 설정 끝!
* A: PID        = Process Id
* E: USER       = User Name
* H: PR         = Priority
* I: NI         = Nice value
* O: VIRT       = Virtual Image (kb)
* Q: RES        = Resident size (kb)
* T: SHR        = Shared Mem size (kb)
* W: S          = Process Status
* K: %CPU       = CPU usage
* N: %MEM       = Memory usage (RES)
* M: TIME+      = CPU Time, hundredths
  b: PPID       = Parent Process Pid
  c: RUSER      = Real user name
  d: UID        = User Id
  f: GROUP      = Group Name
  g: TTY        = Controlling Tty
  j: P          = Last used cpu (SMP)
* P: SWAP       = Swapped size (kb)
  l: TIME       = CPU Time
  r: CODE       = Code size (kb)
  s: DATA       = Data+Stack size (kb)
  u: nFLT       = Page Fault count
  v: nDRT       = Dirty Pages count
  y: WCHAN      = Sleeping in Function
  z: Flags      = Task Flags <sched.h>
* X: COMMAND    = Command name/line

Posted by KT한
,