xinetd 에 바이너리 등록

sudo apt-get install xinetd

/etc/xinetd/uaf

service uaf{
    disable     = no //실행할거면 no
    type        = UNLISTED
    id      = uaf-stream
    socket_type = stream //TCP socket
    protocol    = tcp //TCP
    user        = uaf //바이너리 실행되는 권한
    server      = /home/cr3denza/uaf //바이너리 경로
    wait        = no
    port        = 1337 //포트
}

/etc/service

uaf        1337/tcp //서비스파일에 등록
Read more

우분투 SSH 서버의 배너와 motd

UBUNUT SSH 서버에 접속 시도를 하면 로그인이 성공하기 전에 뜨는 배너와 로그인이 성공한 후에 뜨는 메세지가 있다.

id, pw를 입력하기 전에 뜨는 배너는 디폴트 값으로 /etc/issue.net 을 읽어온다.
issue.net 안의 내용을 다 지우고 새로운 텍스트를 넣으면 ssh 연결이 되자마자 새로운 배너를 가져온다.
/etc/ssh/sshd_conifg 안에 적혀있는 Banner=/etc/issue.net 를 변경하여 배너파일을 바꿀수 있다.

로그인이 성공한 후에 뜨는 메세지는 Message Of The Day 라고 한다.
/etc/motd 이 존재하면 수정하고 없으면 만들어 ssh 로그인 성공후에 출력되는 메세지를 변경할 수 있다.

Read more

내가 필요 했던 MACBOOK TIP (계속 업뎃)

1. SMC 초기화

- 컴퓨터 종료
- MacSafe 전원 아답타 연결
- 내장키보드의 왼쪽에 있는 shift + control + option 키와 power 키를 동시에 누름
- 눌렀던 키 모두를 동시에 놓음
- 컴퓨터를 킴

2. MACBOOK beta update

sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate CatalogURL https://swscan.apple.com/content/catalogs/others/index-10.10seed-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz


sudo softwareupdate --clear-catalog

3. Windowserver 재시작

sodo killall -HUP WindowServer

4. 특정앱 언어 변환

defaults write -app iTunes AppleLanguages "(ko)"
defaults write -app iTunes AppleLanguages "(en)"

5. 숨김파일 표시

defaults write com.apple.Finder AppleShowAllFiles YES
defaults write com.apple.Finder AppleShowAllFiles NO
killall Finder //Finder 재시작하여 적용

6. Wifi 충돌 문제

AirDrop 을 위한 Apple Wireless Direct Link (AWDL) 인터페이스가 wifi 사용에 방해가 되는 오류가 발생하여 wifi 문제시 AWDL을 다운시키면 인터넷 잘됨

sudo ifconfig awdl0 down
sudo ifconfig adwl0 up
Read more

linux 서버, 클라이언트 통신 속도 측정하기

linux 서버, 클라이언트 통신 속도 측정하기

server 와 client 모두 iperf 프로그램을 설치한다. 우리의 친구 apt-get 을 이용하자.
sudo apt-get install iperf 

서버 측
iperf -s

클라이언트 측
iperf -c SERVER_ADDR

서버 측

클라이언트 측
90Mbits/sec....



Read more

linux repository 변경하기

linux repository 변경하기

sudo /etc/apt/sources.list

sources.list 파일 안의 내용을 수정하면 repository 변경된다.

kr.archive.ubuntu.com 을  ftp.daum.net 바꾼다.
:%s/kr.archive.ubuntu.com/ftp.daum.net/g
또는
:%s/us.archive.ubuntu.com/ftp.daum.net/g

archive 이외에도 security.ubuntu.com, extras.ubuntu.com 도 ftp.daum.net 으로 바꾸면 빨라 진다.

sudo apt-get update
sudo apt-get upgrade
ftp.daum.net 으로 접속 하는 것을 확인 할 수 있다.

Read more

linux 특정 사용자에게 sudo 권한 부여하기

linux 특정 사용자에게 sudo 권한 부여하기

/etc/sudoers 파일을 수정하여 특정 사용자가 sudo 를 사용하게 할 수 있다.

sudo chmod 660 /etc/sudoers
읽기 전용 파일이라 파일 수정동안 잠시 쓰기를 가능하게 만든다.

sudoers 파일 안에 아래의 형식에 맞게 입력해준다. (ID : cr3denza)

# User privilege specification
root    ALL=(ALL:ALL) ALL
cr3denza    ALL=(ALL:ALL) ALL

sudo chmod 440 /etc/sudoers
수정이 완료됬으니 권한 원래대로 복구한다.

cr3denza 사용자는 이제 sudo 명령어를 사용할 수 있다.


Read more

메모리 확인, ASLR 설정

- 메모리 보기

/proc/$pid/map

- ASLR 설정하기

임시로 끄기
/proc/sys/kernel/randomize_va_stace0: OFF 1: ON(stack only) 2: ON(stack, heap)
영구적 끄기
sysctl -w kernel.randomize_va_space=0

Read more

c로 작성된 python module 만들기

c로 작성된 python module 만들기

C로 작성된 함수를 파이썬에서 import 해서 사용하기 위해서는 C로 작성된 프로그램 코드를 파이썬이 import할 수 있는 라이브러리 파일로 변환해 주어야 한다. (ubuntu 환경에서 할거임)

swig(Simplified Wrapper and Interface Generator)라는 툴을 사용하면 간단히 라이브러리파일로 만들어 낼 수 있다. swig는 파이썬뿐만 아니라 다른 언어에서도 C코드를 사용가능하게 라이브러리를 만들어주는 툴이다. 

설치
sudo apt-get install swig 
공식 홈페이지
www.swig.org


위의 간단한 코드를 라이브러리로 만들어서 파이썬에서 실행 시켜보자.
ex.c파일을 이용해서 ex.i 파일을 만들어줘야 한다. 보통 컴파일러를 사용하면 전처리기가 해주는 작업을 비스무리하게 직접하여 .i파일을 만들어 줘야 한다.

첫 번째 줄에는 %(module name)이 들어가고
%{
이 부분에는 사용하는 함수들의 선언, 전역변수(구조체)의 선언, define, 헤더파일을 extern으로 선언해준다.
%}
그리고 그 밑에는 그냥 한 번 더써준다. 


ex.c 파일과 ex.i 파일이 준비가 되었다. 이제 swig를 이용해서 만들면 된다.
swig -python ex.i
명령어를 실행하면 ex_wrap.c와 life.py가 생성된다. life는 모듈이름이고 ex는 c코드 파일명이다.
gcc -fpic -c ex.c ex_wrap.c -I/usr/include/python2.7
object 파일 두 개(ex.o ex_wrap.o)가 생성되었다. -I뒤에는 Python.h 를 참조할수 있게 파이썬이 설치된 경로를 넣으면 된다. 나머지 옵션은 man gcc에 들어가면 확인할 수 있다.
ld -shared ex.o ex_wrap.o -o _life.so
_life.so 파일을 뽑아준다. .so 파일이름은 반드시 _(module name)으로 해야한다.
python 을 실행하고 import 해서 사용할 수 있다.
굳~

C로 작성된 함수에서 인자로 포인터를 받는 경우 그냥 느낌에 맞게 넣자(char * 는 string형으로)
ctype의 (c_char_p) 이런걸로 형 맞춰줘도 되지 않는다.

unsigned char * 같은 걸 넘겨주려면 string (char *)으로 넘겨주고 C코드 안에서 인자를 받자마자 강제 형변환을 해버리니 잘 된다. 
ex) argv[1] = (unsigned char *)argv[1]

함수의 결과 값을 return으로 받지 않고 argv의 구조체 인자로 받으면 받아지지 않는다.
Read more

컴퓨터 사양 확인

CPU-Z 라는 프로그램을 사용하여 컴퓨터 사양 조사

CPU-Z 프로그램은 32비트 컴퓨터용과 64비트 컴퓨터용으로 나뉜다. 자신의 컴퓨터에 맞는 버전을 다운로드 받은 후 실행 한다.

내 컴퓨터의 비트는 내컴퓨터 아이콘에서 마우스 오른쪽을 클릭한 후 속성을 클릭하면 확인 할 수 있다.



64비트 운영 체제가 써있으면 64비트다.

CPU-Z_32_DOWNLOAD
CPU-Z_64_DOWNLOAD

CPU-Z를 실행 시킨다






이름에 Intel Core I5-2500K 가 써있다. CPU다.



CPU 칸에 알맞게 받아쓰기 해준다.



Memory 탭으로 이동하면 크기가 보인다. 이것이 총 RAM 이다.



RAM에서 /의 앞의 부분에 받아쓰기 해준다. 이제 RAM의 슬롯 개수를 알아보자. 이것도 물론 어렵지 않다.



SPD 탭으로 가면 메모리 슬롯 선택 부분이 있다. 위 그림의 빨간 박스를 클릭해보면 슬롯의 개수를 알 수 있다.

Slot #1

클릭했는데 이렇게 나온다면 슬롯은 1개가 있는 것이고

Slot #1
Slot #2

이렇게 나온다면 슬롯은 2개가 있는 것이다. 물론 어렵지 않다. 슬롯의 개수를 잘 기억해서 엑셀에 다시 작성해 보자. 확인 결과 나는 슬롯이 2개가 있었고 4G씩 꽃혀 있었다.




CPU-Z로 확인 할 수 있는 사항은 다 확인하였다. 힘든 여정이였다. 이제 좀 더 난이도를 높여 컴퓨터 사양을 확인해본다.

HDD 의 총 용량을 알아 보기 위해 WIN + E 를 누른다. WIN은 윈도우 운영체제를 사용하는 컴퓨터의 키보드에있는 윈도우마크 모양의 키다. 일반적으로는 좌측 컨트롤키와 좌측 알트키의 사이에 존재한다.




우와우 많은 아이콘들이 나와서 머리가 아프려한다. 여기서 우리가 확인할 것은 빨간 네모가 쳐있는 아이콘들이다. 위의 구성은 컴퓨터 마다 전부 다르다!!

기본 구성을 알아보기 위해서는 먼저 USB, 외장하드, 핸드폰등 컴퓨터에 연결된 모든 것들을 전부 뺀다.(전원이나 모니터 선을 빼면 안된다) 그리고 위에서 배운 단축키(WIN + E)를 누른다. 여기서 용량이 표시되는 것들을 더하면 HDD의 총 용량이 된다.
나의 경우 465 + 417 + 49 = 대충 1TB
간단한 수학이다 겁먹지 말자




모델명은 컴퓨터의 케이스에 있는 모든 글들을 읽어보자
삼보가 써있는 컴퓨터 / 삼보가 써있지 않은 컴퓨터로 분류될 것이다
삼보가 써있다면 삼보를 안써있다면 조립을 작성하자

컴퓨터를 다시 탐색해보자.



이런 생김새의 안테나가 USB 에 꽃혀 있다면 USB형,
없는데 인터넷이 된다면 내장형이다




Read more

plt로 got 채우기

puts@plt + 0에 puts@plt + 6의 주소가 들어있어서 호출되면 puts@plt+6의 코드가실행

puts@plt + 11 에서 점프하면 pushl, jmp로 분기된다.
pushl로 GOT+4의 주소를 스택에 넣고 GOT+8의 주소로 분기하는데 여기에는_dl_runtime_resolve의 주소가 있다.
_dl_runtime_resolve 에서 _dl_fixup 을 호출한다.

_dl_fixup 함수에서는 edi에 puts의 offset을 넣고 esi에 .strtab의 주소를 넣는다

(.strtab + offset = 'puts' 문자열이 들어가있다.)
eax에는 'puts'문자열의 주소를 넣고 _dl_lookup_symbol_x 함수를 호출한다.

_dl_lookup_symbol_x 함수에서는 SYMTAB의 주소와 lib의 주소를 얻고 _dl_fixup 함수로 나와서 SYMTAB에서 아까전에 넣어논 esi(.strtab), edi(offset)응 이용해 실제 주소를 구하고 GOT에 write하고 _dl_runtime_resolve 함수로 다시와서 puts함수로 넘어가게 된다.

이런식으로 한번 dynamic linker가 주소를 받아오는 과정을 거치게 되면 다음번에는_dl_runtime_resolve함수로 들어가지 않고 바로 puts@plt에서 바로 실제 puts함수의 코드로 들어가게 된다.
--------------------------------------------------------------------------------------------
1. puts@plt
2. puts@plt+6
3. puts@plt+11
4. _dl_runtime_resolve(GOT+8)
 실행 전에는 GOT+8이 0임, 메모리에 올라가면 GOT+8에 _dl_runtime_resolve의 주소가 들어감
5. _dl_fixup
 edi : puts의 offset
 esi : &.strlab
 eax : &"puts"
 <이놈들을 조작할 수 있으면 원하는 함수를 실행 할 수 있다.>
6. _dl_lookup_symbol_x 
 SYMTAB주소 얻음
 lib의 주소 얻음
7. _dl_fixup
 edi : puts의 offset
 esi : &.strlab
 이 두개를 이용해 SYMTAB에서 실제 주소 구해서 GOT에 write
8. _dl_runtime_resolve
 puts의 공유라이브러리(실제 puts함수)로 넘어감
--------------------------------------------------------------------------------------------
Read more

포멧 스트링 버그, Format String Bug(2)

포멧 스트링 버그, Format String Bug

저번 포스팅에서 포멧 스트링 버그를 이용해서 메모리 릭을 하는 방법과 %n 포멧스트링을 어떻게 사용하는지 까지 설명하였다. 이번 포스팅에서는 직접 원하는 메모리에 %n 포멧스트링을 이용하여 원하는 값을 넣어보자.

먼저 확인할 코드!



메모리가 제대로 조작되는지 확인하기 위해 저번 포스팅의 코드에서 dumpcode만 추가 하였다.
dumpcode함수를 사용하기 위해서는 dumpcode.h파일이 있어야한다. 



위의 포스팅으로 들어가서 코드를 복사한뒤 dumpcode.h파일을 만들어 붙여넣기 하면 된다.



버퍼부터 시작하여 100bytes 만큼의 메모리를 출력해준다. 이제 %n을 이용해서 아무 메모리에나 값을 써보자.
0xffffd6d8에 값을 써보기로 한다.



0xffffd6d8에 출력된 문자열의 길이인 0xe값이 들어갔다 성공이다! 근데 메모리를 변조하여 공부하려면 최소한 4bytes는 변조를 해야하는데 한번에 0~65535, 0x00~0xFF, 2byte 밖에 수정하지 못한다. 그래서 두번에 나누어 주소값을 써줘야 한다.
처음번에 0xffffd6d8에 값을 쓰고 두번째에는 0xffffd6da에 나머지 값을 써야한다. exploit을 할때는 당연히 엔디언을 생각해서 제대로된 값이 들어가도록 해야한다.
지금은 테스트이고 귀찮으니까 그냥 0xffffd6d8에 0xffffffff 값을 써넣어 보자. 



엄청난 공백이 생기고 0xffffd6d8에 0xffffffff의 값이 써진것을 확인할 수 있다.

python -c 'print "\xd8\xd6\xff\xffAAAA\xda\xd6\xff\xff%65521x%x%n%65536x%n"' | ./fsb1

쉘코드를 보면 \xd8\xd6\xff\xff와 뒤쪽의 첫번째 %n과 매치가 된다. 여기에 들어가는 값을 조정하기 위해 %n앞에 %x%x 이 두개를 이용해 메모리에 쓸 값을 맞출 수 있다. 그리고 다음 2bytes를 덮기 위해서는 \xda\xd6\xff\xff을 %n과 매치시켜주면 되지만 바로 매치시키면 메모리에 쓸 데이터 조절을 할수가 없다. 그래서 임의로 의미없는 데이터인 AAAA를 %x로 출력해주고 이 부분에서 뒷부분 2bytes에 들어갈 값을 조절할 수 있게 된다.

이제 fsb가 발생하면 원하는 주소의 메모리값을 바꿀수 있게 되었다. 이를 이용해 ret, got, dtor등을 조작해 exploit에 성공할 수 있다.
Read more

포멧 스트링 버그, Format String Bug(1)

포멧 스트링 버그, Format String Bug

포멧 스트링 버그는 printf 함수 등에서 사용되는 포멧 스트링(%d, %s...)을 잘못된 형태로 사용할 경우 발생하는 버그이다. 포멧 스트링은 데이터를 어떤 형식에 따라 입력받거나 출력하기 위하여 사용하는데 형식을 잘못사용하면 메모리의 데이터가 유출되고 변조될 수 있다.
포멧 스트링 버그는 메모리 릭, 메모리 변조 모두 가능하기 때문에 취약점이 발생하면 exploitable할 가능성이 높다.

printf함수는 아래의 두가지 방법으로 사용할 수 있다.

printf(BUFFER)
printf("FORMAT_STRING", BUFFER)

포멧 스트링 버그는 포멧스트링을 사용하지 않고 바로 BUFFER를 출력하는 첫번째 printf 함수 사용법에서 발생한다. 만약 BUFFER 안에 %x, %d등 포멧 스트링이 들어가면 printf함수는 그것들을 포멧스트링으로 보고 두번째 printf 함수 사용법과 같이 동작하여 스택 메모리를 유출시킨다.

예제 코드를 작성하여 첫번째 방법과 두번째 방법의 printf함수를 비교하며 동작시 스택에 쌓이는 데이터들을 확인해보자.
간단한 에코 프로그램이다. 7번째 줄의 printf에서는 포멧스트링 버그가 발생하고 9번째 줄의 printf에서는 포멧스트링 버그가 발생하지 않는다. 

아래는 포멧스트링버그가 발생하지 않는 9번째 줄의 printf 함수 호출 직전의 스택 모양과 ESP가 가리키는 곳이다.



printf 함수를 콜하게 되면 먼저 FORMAT_STRING을 POP한다. ESP는 한칸 내려가 &BUFFER를 가리킨다. 
FORMAT_STRING을 읽으면서 문자열은 그냥 출력하고 포멧스트링을 만난다면 POP을 하면서 BUFFER의 데이터를 4bytes씩 짝에 맞는 포멧스트링 형식으로 출력을 해준다.

EX)
FORMAT_STRING = "HI, %d, %d!!"
BUFFER[] = {10, 20}
BUFFER 메모리에는 0x00000014 0x0000000A.
이 데이터들을 pop하여 FORMAT_STRING과 매핑.

출력 : HI, 20, 10!!



이런식으로 문자열을 하나잡고 출력하면서 포멧스트링(%d, %c..)을 만나면 BUFFER에서 4byte씩 뽑아와서 형식에 맞게 출력을 한다.

이제 포멧스트링버그가 발생하는 9번째 줄의 printf 함수 호출 직전의 스택모양을 확인해보자.



FORMAT_STRING 문자열이 들어가 있던곳에도 BUFFER의 주소가 들어가 있다. 만약 BUFFER안에 %d같은 포멧스트링이 없다면 그냥 BUFFER를 출력하고 버그없이 printf함수가 종료될 것이다. 하지만 포멧스트링이 있다면 위의 제대로 사용된 printf함수와 같이 동작하게 된다. 
왼쪽 사진에서 ESP가 가리키는 BUFFER를 출력해 나가다가 포멧 스트링을 만나게되면 두번째 BUFFER에서 데이터를 뽑아서 형식에 맞게 출력을 해준다. 즉 하나의 문자열(문자+포멧스트링)로 출력을 하면서 데이터를 뽑아 오기까지 한다.




위의 예제 코드를 컴파일 하고 테스트를 통해 확인하여 보자.



바이너리를 실행하고 입력을 AAAA %x %x %x %x로 주었다.

위 화면의 AAAA %x %x %x %x 은 키보드입력값이고 그 다음줄에 나오는
AAAA ffffd6a8 40 41414141 20782520 은 잘못된 포멧스트링 사용으로 인해 메모리 릭이 일어난 것이고 I am safa!, AAAA %x %x %x %x는 정상적인 포멧스트링 사용으로 제대로된 문자열이 출력되었다. 

더 보자. 처음 AAAA는 문자열이니 그냥 출력이 되었고 %x를 만났다. 첫번째 %x는 위의 스택그림의 &BUFFER와 매핑되어 BUFFER의 주소가 출력되었다. ffffd6a8은 BUFFER의 주소이다. 그리고 두번째 %x는 더미같은 40과 매핑되어 40이 출력되었다 그리고 두, 세번째 %x는 BUFFER와 매핑되어 BUFFER 맨 앞에 8bytes가 출력되었다. A는 아스키코드로 0x41이고 스페이스는 0x20, %는 0x25, x는 0x78이다.

여기서 이 버그를 제대로된 취약점으로 승화 시킬수 있다.

잘보면 BUFFER의 앞의 AAAA를 뒤의 %x를 이용해서 출력을 하는 것을 볼 수 있다. 우리의 입력값을 우리가 출력하게 만들수 있게 되었다. 만약에 AAAA에 우리가 원하는 데이터의 주소를 넣는다면 AAAA주소에 있는 데이터를 릭하게 될것이다.


코드를 위와 같이 수정하고 컴파일하여 실행하여 buf1에 들어있는 DEAD문자열을 릭해보자.



BUFFER의 맨 앞부분에 DEAD문자열의 주소값을 엔디언이 맞게 넣어둔다. 그리고 %x를 이용해 BUFFER의 주소를 뽑아서 출력하고 0x40을 뽑아서 출력한다. 그리고 마지막에 %s를 이용해 조금전에 입력한 DEAD의 주소값을 뽑아와서 %s형식으로 출력해준다. DEAD 문자열이 릭되었다.

[    DEAD의 주소     ][    %x    ][  %x ][ %s  ] // 쉘코드 구성
[????(DEAD의 주소)][&BUFFER][0x40][DEAD] // 출력결과

스택을 pop하면서 포멧스트링에 맞게 출력을 하다 우리가 입력한 BUFFER까지 pop을 하여 출력을 하게된다. 그래서 BUFFER에 임의의 주소값을 넣고 %s로 출력을 하면 원하는 메모리를 릭할 수 있다.

이제 %x, %s 이외의 포멧스트링버그의 핵심인 %n에 대해 알아보자.
%n은 현재까지 출력한 문자의 개수를 메모리에 쓰는 포멧 스트링이다. 사용예제를 확인해보자.
이 코드를 실행하면 아래의 화면이 출력된다.



%n으로 &i에 출력한 개수를 쓴다. 위에서 확인했듯이 printf의 두번째 인자인 포멧스트링의 형식의 데이터가 들어있는 스택을 조작할 수 있다. AAAA에 주소를 넣고 %s로 출력시켜 원하는 메모리 주소를 릭 시켰던것 처럼 원하는 메모리주소에 %n을 이용하여 원하는 값을 넣을 수 있다.
%n 은 출력한 값들 개수를 메모리에 쓰는것인데 버퍼의 크기등의 문제로 많은 데이터를 입력하기 어렵다. 원하는 값을 맞추기 위해서는 %10d, %100c 등의 포멧스트링을 사용해야 한다.

%n을 이용해서 원하는 주소의 메모리에 데이터를 쓰는 건 다음 포스팅에서 알아보도록 하자.
힘들다.
Read more

라이브러리 로딩 - ld.so.conf

라이브러리 로딩 - ld.so.conf

라이브러리란 무엇인가?

프로그램에서 공통으로 사용할 수 있는 기능을 포함하고 있는 오브젝트 파일이다.

동적 라이브러리란 무엇인가?

프로그램을 컴파일하여 생성되는 바이너리에 포함하지 않고 바이너리가 실행하는 시점 또는 실행 후에 포함시킬 수 있도록 제작된 라이브러리를 말한다. 그래서 동적이라는 이름이 붙은듯!! 이런 형식의 라이브러리는 프로그램을 실행할 때 호출되는 로더에 의해서 메모리에 적재된다.

동적 라이브러리를 호출하기 위해서는 path 지정이 필수이다. 해당 라이브러리가 어디에 위치해 있는지 모든 디렉토리를 탐색하기에는 비효율적이기 때문이다. 우리가 흔히 설정하는 LD_LIBRARY_PATH 환경변수가 동적 라이브러리 호출을 위한 path 지정에 사용되는 환경 변수이며 또 다른 방법으로 시스템 설정을 통해서 지정할 수 있다. 이때 사용되는 설정 파일이 리눅스 기준으로 /etc/ld.so.conf 파일이 되겠다. 리눅스 Kernel 2.6 이후 부터 /etc/ld.so.conf.d 디렉토리에 *.conf 파일 형식으로 설정할 수 있다.

로더는 LD_LIBRARY_PATH 또는 ld.so.conf 에 명시된 디렉토리에서 동적 라이브러리를 찾으며 해당 디렉토리에 없으면 Not Found 에러를 출력한다. 컴파일시 link 오류나 실행시 loading 오류를 만나게 된다면 위 두가지 설정을 점검해 보기 바란다.

LD_LIBRARY_PATH 나 ld.so.conf 두군대 모두에게 설정될 필요는 없으나 다음과 같은 경우에는 ld.so.conf 에 설정하도록 유의해 보자. 바이너리에 setuid, setgid 등이 설정된 경우 리눅스의 로더는 LD_LIBRARY_PATH 환경 변수 설정을 무시해 버린다고 한다. 그도 그럴것이 악의적으로 시스템 주요 함수들이 setuid를 가진 바이너리가 호출한 라이브러리에 의해서 오버라이딩 된다면??? 끔직할 것이다. 그런 보안을 고려한 것인지 모르겠지만 로더는 ( uid != euid || gid != egid ) 상황에서 LD_LIBRARY_PATH 를 무시하기 때문에 아무리 컴파일시에 link가 정상이고 ldd로 확인해도 정상이지만 바이너리 실행시 해당 라이브러리를 찾을 수 없다는 오류를 만나게 될 것이다. 이런 경우는 LD_LIBRARY_PATH가 아니라 ld.so.conf 에 설정을 해줘야 한다.

공부를 하는 동안 관련된 몇 가지 링크와 명령어에 대해서 조금더 조사를 했다.

관련 링크 :  
관련 명령어 :
  • ldconfig - /etc/ld.so.conf 설정된 동적 라이브러리 정보를 /etc/ld.so.cache 파일로 만들어 주는 일을 한다. 이로서 로더는 ld.so.cache 정보를 기반으로 보다 빠르게 라이브러리를 찾아 낼 수 가 있다. ld.so.conf 설정을 변경하면 반드시 ldconfig 명령을 수행하여 cache 를 갱신해 주도록 하자.
  • ldconfig
    ldconfig -p
  • ldd - 공유 라이브러리의 의존성을 검사해 준다. 동적 라이브러리도 공유 라이브러리 이므로 link 시나 load 시에 에러가 난다면 점검을 해보자.
  • ldd
  •  objdump - 오브젝트 파일에 대한 정보를 출력해 준다. Dynamic Section의 NEEDED 로 표기된 항목이 공유 라이브러리를 표시한다고 한다.
  • objdump -p
출처 : http://blog.daum.net/mzinboy/3

Read more

VIM CHEAT SHEET

VIM CHEAT SHEET

Cursor movement

h - move cursor left
j - move cursor down
k - move cursor up
l - move cursor right
w - jump forwards to the start of a word
W - jump forwards to the start of a word (words can contain punctuation)
e - jump forwards to the end of a word
E - jump forwards to the end of a word (words can contain punctuation)
b - jump backwards to the start of a word
B - jump backwards to the start of a word (words can contain punctuation)
0 - jump to the start of the line
^ - jump to the first non-blank character of the line
$ - jump to the end of the line
G - go to the last line of the document
5G - go to line 5

Tip Prefix a cursor movement command with a number to repeat it. For example, 4jmoves down 4 lines.

Insert mode - inserting/appending text

i - insert before the cursor
I - insert at the beginning of the line
a - insert (append) after the cursor
A - insert (append) at the end of the line
o - append (open) a new line below the current line
O - append (open) a new line above the current line
ea - insert (append) at the end of the word
Esc - exit insert mode

Working with multiple files

:e filename - edit a file in a new buffer
:bnext or :bn - go to the next buffer
:bprev or :bp - go to the previous buffer
:bd - delete a buffer (close a file)
:sp filename - open a file in a new buffer and split window
:vsp filename - open a file in a new buffer and vertically split window
Ctrl + ws - split window
Ctrl + ww - switch windows
Ctrl + wq - quit a window
Ctrl + wv - split window vertically
Ctrl + wh - move cursor to next buffer (right)
Ctrl + wl - move cursor to previous buffer (left)

Editing

r - replace a single character
J - join line below to the current one
cc - change (replace) entire line
cw - change (replace) to the end of the word
c$ - change (replace) to the end of the line
s - delete character and substitute text
S - delete line and substitute text (same as cc)
xp - transpose two letters (delete and paste)
u - undo
Ctrl + r - redo
. - repeat last command

Marking text (visual mode)

v - start visual mode, mark lines, then do a command (like y-yank)
V - start linewise visual mode
o - move to other end of marked area
Ctrl + v - start visual block mode
O - move to other corner of block
aw - mark a word
ab - a block with ()
aB - a block with {}
ib - inner block with ()
iB - inner block with {}
Esc - exit visual mode

Visual commands

> - shift text right
< - shift text left
y - yank (copy) marked text
d - delete marked text
~ - switch case

Tabs

:tabnew filename or :tabn filename - open a file in a new tab
Ctrl + wt - move the current split window into its own tab
gt or :tabnext or :tabn - move to the next tab
gT or :tabprev or :tabp - move to the previous tab
#gt - move to tab number #
:tabmove # - move current tab to the #th position (indexed from 0)
:tabclose or :tabc - close the current tab and all its windows
:tabonly or :tabo - close all tabs except for the current one

Cut and paste

yy - yank (copy) a line
2yy - yank (copy) 2 lines
yw - yank (copy) word
y$ - yank (copy) to end of line
p - put (paste) the clipboard after cursor
P - put (paste) before cursor
dd - delete (cut) a line
2dd - delete (cut) 2 lines
dw - delete (cut) word
D - delete (cut) to the end of the line
d$ - delete (cut) to the end of the line
x - delete (cut) character

Exiting

:w - write (save) the file, but don't exit
:wq or :x or ZZ - write (save) and quit
:q - quit (fails if there are unsaved changes)
:q! or ZQ - quit and throw away unsaved changes

Search and replace

/pattern - search for pattern
?pattern - search backward for pattern
n - repeat search in same direction
N - repeat search in opposite direction
:%s/old/new/g - replace all old with new throughout file
:%s/old/new/gc - replace all old with new throughout file with confirmations
출처 : http://vim.rtorr.com
Read more