2011. 6. 29. 23:17

♧ od는 octal dump(『octal』은 8진법을 뜻함)로, 기본적으로 바이너라 파일을 8진수로 덤프해서 출력.

   

[ 기본적인 8진수 덤프 ]

⊙ 행 앞 첫 컬럼에 해당하는 숫자(밝은녹색 테두리 부분)는 시작점으로부터의 오프셋을 8진수로 표시한 것.

(※ offset은 좌측 메모리 시작점을 0으로 하여 숫자를 통해 위치를 알려주는 좌표계 역할을 함)

   

[ 출력 형식 지정 ] -t옵션(--format=TYPE)

⊙ 일반적으로 8진수 보다 16진수로 표시되는 게 알기 쉽다.

의미

a

문자의 이름(7비트 ASCII)

c

ASCII문자 or 이스케이프(escape)문자

f[SIZE]

부동소수점 수

o[SIZE]

8진수

d[SIZE]

부호가 있는 10진수

u[SIZE]

부호가 없는 10진수

x[SIZE]

16진수

(※ a,c → 바이트 단위로 출력)

   

[ o, d, u, x :: 뒤에 올 수 있는 크기 지정자]

C

char

S

short

I

int

L

long

   

[ f :: 뒤에 올 수 있는 크기 지정자]

F

float

D

double

L

long double

   

⊙ 오프셋 표기도 8진수 외에 다른 형태로 표시할 수 있다.

'-A 옵션'에 다음 지정자를 이용하면 오프셋의 기수를 변경할 수 있음.

-A옵션 (--address-radix=RADIX)

[radix]

[의미]

o

8진수(기본 설정)

d

10진수

x

16진수

n

오프셋을 표시하지 않음

   

⊙ 또한 z를 덧붙이면 우측에 ASCII문자 표시가 추가.

   

ex) 출력 형식을(-t) 16진수(x) 1Byte단위(1)로 출력하고 우측에 ASCII문자 표시를 추가(z)

오프셋의 기수를 16진수로 출력(-A x)

   

[ 덤프를 생략하지 않기 ] -v옵션 (--output-duplicates)

⊙ 기본적으로 od는 같은 내용이 여러 행에 걸쳐 반복될 경우 그 부분을 생략 한다.

[ 0x0021d0~0x002220 까지는 00이 계속되고 있으므로 『*』와 같이 생략]

   

이 부분을 생략하지 않으려면 -v 옵션을 사용한다.

   

[ 문자열 덤프 기능] -S옵션 (--strings)

⊙ od에는 strings처럼 문자열 덤프 기능이 있다.

ASCII문자가 최소 세 자리 이상이고 \0으로 끝나는 바이트 열을 찾아 오프셋과 내용을 표시한다.

   

⊙ 다음은 위와 같지만 '--strings'옵션을 사용하고 '-An'으로 오프셋 출력을 하지 않는다.

   

(※ 책에서는 '소문자 -s옵션' 이라고 되어 있지만 이건 예전 버전의 옵션이다.

현재 버전에서는 '대문자 -S 옵션'이며 출력되는 최소문자 바이트를 넣어 주어야 한다.

그러므로 그냥 일반 적인 경우는 "--strings" 옵션을 사용하는 것이 호환성 측면에서 좋을 듯하다.)

※ 버전 별로 옵션이 조금씩 틀리므로 man od로 확인 하여 사용하자.

   

테스트 환경 :

  

Posted by devanix
2011. 6. 29. 16:22

♧ file 명령을 이용해서 파일 내용, 종류를 조사.

일반적으로 파일 종류를 알기 위해 확장자를 정해 두고 그 종류를 추측하는 방법을 사용하지만,

file 명령은 파일 내용을 읽어 특징적인 데이터(시그니처)를 찾아 그 종류를 결정.

   

[ 일반적인 file 명령 ]

$ file /usr/bin/file

/usr/bin/file: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs),

for GNU/Linux 2.6.15, stripped

[ -i옵션 : MIME 미디어 타입 문자열로 표시 ]

$ file -i /usr/bin/file

/usr/bin/file: application/x-executable; charset=binary

 

[ file명령이 파일 종류를 판별 하는 순서]

① 디바이스, 디렉토리, 심볼릭 링크 등의 스페셜 파일 체크
② 압축 파일 체크
③ tar 파일 체크
④ magic 데이터베이스 파일에 따른 체크
⑤ ASCII, Unicode 등의 텍스트 파일 종류 체크

위의 어떤 경우에도 해당하지 않으면 단순 바이너리 파일로 판단.

   

[ magic 데이터베이스에는 시그니처 정보가 기록 ]

♧ magic 파일 경로

⊙ /etc/magic
⊙ /usr/share/misc/file/magic (/usr/share/file/magic)

   

♧ magic 파일 내용 ( ※ 현재 집에 설치되어 있는 "Ubuntu 10.04.2 LTS"로 테스트)

   

♧ magic 파일의 엔트리는 4개의 필드로 구성

처음 혹은 이전 레벨로부터의 오프셋 값

데이터 종류

출력 문자열

 

⊙ 여기서 레벨은 오프셋 값의 앞에 적힌 '>'을 의미.

'>4'이라고 적혀 있으면, 다시 처음부터 4바이트 떨어진 위치를 읽고 비교.

⊙ 같은 수의 '>'가 나열되어 잇는 경우.

같은 방식으로 이전 레벨로부터의 오프셋 값에 해당 하는 내용을 보고 진행

⊙ '일치한 엔트리 앞에 '>'가 하나 더 많은('>>') 엔트리가 있으면 계속해서 그 엔트리에 대한 일치처리.

 

[ 앞서 살펴본 elf파일에 대한 file 명령 자신을 판별하는 순서. ]

0     string     \177ELF     ELF

파일의 처음부터 0바이트 떨어진 위치의 문자열이 "\177ELF"와 일치하는지 확인.

→ 일치하므로 "ELF"라고 표시

>4    byte       0           invalid calss

처음부터 4바이트 떨어진 위치의 1바이트가 1임을 확인.

→ 일치하지 않으므로 다음 행으로 이동.

>4    byte       1           32-bit

처음부터 4바이트 떨어진 위치의 1바이트가 1임을 확인.

→ 일치하므로 "32-bit"라고 표시

④ 이후 당분간 일치하지 않으므로 계속 진행.

>5    byte       1           LSB

처음에서부터 5바이트 떨어진 위치의 1바이트가 1임을 확인.

→ 일치하므로 "LSB"라고 표시.

⑥ 이 과정을 끝까지 반복.

 

[ 정리 ]

file 명령을 사용하면 파일 내용으로부터 파일 종류를 판별할 수 있다.
또한 새로운 파일 형식이 생겨나도 그 파일의 고유한 시그니처를 알면
magic 파일에 엔트리를 추가하여 그 파일을 인식할 수 있도록 되어 있다.

(※ 자세한 내용은 man magic 참조)

Posted by devanix
2011. 6. 29. 15:04

[ ABI(Application Binary Interface) ]

애플리케이션이 지켜야 할 바이너리 레벨의 규약.

함수호출 시 스택 또는 레지스터 사용법, 심볼 name mangling 규칙 등이 정해져 있다.

OS, 프로세서별로 규정되어 있다.

   

[ API(Application Programming Interface ]

애플리케이션 프로그램에서 OS나 라이브러리의 기능을 이용하기 위한 함수, 데이터 구조 규약.

API를 이용한 프로그래밍은 동일한 API를 지원하는 플랫폼 간 소스코드 호환성을 갖는다는 이점이 있다.

   

[ BSS 세그먼트(Block Started by Symbol Segment) ]

초기화되지 않은 데이터가 위치하는 세그멘트.

C의 전역 변수로 int global;과 같이 초기값이 지정되지 않은 데이터가 들어간다.

오브젝트 파일 내에서는 크기를 갖지 않고 프로그램 시작 시에 커널에 의해 0으로 초기화 된다.

ELF에서의 명칭은 .bss이다.

   

[ DSO(Dynamic Shared Object) ]

GNU/리눅스에서는 동적 링크하는 공유 라이브러리를 DSO 라고 한다.

.so라는 확장자를 갖는다

   

[ DWARF(Debug With Arbitrary Record Format) ]

디버그 정보를 저장하기 위한 데이터 형식.

GNU/리눅스 + GCC 환경에서는 표준으로 사용되고 있다.

DWARF 또는 ELF는 그 이름 때문에 '반지의 제왕'과 관계가 있는 게 아닌지 의심받기도 한다.

   

[ ELF(Executable and Linking Format) ]

실행 파일, 오브젝트 파일, 공유 라이브러리, 코어 파일에 사용되는 파일 형식 중 하나.

GNU/리눅스, FreeBSD 등에서 사용되고 있다.

   

[ GCC(GNU Compile Collection) ]

GNU의 각종 컴파일러 모음. 원래는 GNU C Compiler를 의미했다.

GNU C Compiler를 나타낼 때는 gcc라고 표기한다.

   

[ glibc(GNU C Library) ]

GNU의 C 라이브러리. GNU/리눅스나 Hurd 등의 OS에서 사용되고 있다.

   

[ GNU(GNU's Not Unix) ]

본래는 GNU 프로젝트가 개발되고 있는 OS를 일컬었으나,

GNU 프로젝트 자체를 GNU로 부르는 경우가 많다

   

[ GNU/리눅스 ]

리눅스 커널 기반의 시스템.

GNU를 앞에 붙이는 이유는 커널 외의 컴포넌트를 개발하고 있는 GNU 프로젝트에 경의를 표하기 위함.

   

[ GOT(Global Offset Table) ]

PIC를 실현하기 위해 필요한 데이터.

PIC에서는 전역 데이터로의 접근을 GOT를 이용해 간접적으로 참조한다.

   

[ LLP64 ]

long long과 포인터가 64비트인 환경.

int와 long은 32비트. 64비트 윈도우에서는 LLP64.

   

[ LP64 ]

long과 포인터가 64비트인 호나경. int는 32비트. 64비트 리눅스에서는 LP64.

대부분의 유닉스 계열 OS에서는 LP64를 사용.

   

[ PIC(Position Independent Code) ]

임의의 주소에 로드 가능한 코드.

데이터 액세스나 점프는 상대 주소로 수행한다. 위치 독립 코드.

   

[ PIE(Position Independent Executable) ]

위치독립인 실행 파일. 최근의 GNU/리눅스에서 작성할 수 있다.

보안 향상 등의 장점이 있다.

   

[ PLT(Procedure Linkage Table) ]

동적 링크를 실현하기 위해 필요한 데이터.

GOT와 함께 사용해서 동적 링크한 공유 라이브러리 함수를 간접적으로 호출할 수 있다.

   

[ POSIX(Portable Operating System Inerface for UNIX) ]

시스템콜, 시그널과 같은 OS의 API를 규정하는 규약.

대부분의 유닉스 계열 OS는 POSIX를 기반으로 하고 있다(or POSIX 표준을 따르려 한다).

   

[ SUS(Single UNIX Specification) ]

유닉스로 불리는 OS를 위한 규격. 최신 버전인 SUSv3는 웹상에서 볼 수 있다.

SUSv3는 POSIX를 포함하고 있다.

   

[ TLS(Thread Local Storage) ]

여러 스레드에서 동일한 이름의 변수를 사용하더라도 실제로는 각 스레드의 독립된 영역에 저장되는데,

이를 TLS라 한다. GCC에서는 __thread라는 키워드를 사용해서 TLS를 다룬다.

   

[ prelink ]

동적 링크를 빠르게 하기 위한 방법 중 하나.

실행 파일과 공유 라이브러리를 수정함으로써 동적 링크 시 발생하는 비용을 대부분 삭감한다.

많은 리눅스 배포판에 사용되고 있다.

   

[ x86 ]

인텔(Intel)사의 8086 계열의 프로세서를 약칭함.

80486 이후 Pentium, Xeon 등의 제품명을 갖는다. IA-32라고도 한다.

   

[ x86_32 ]

x86_64와 구별하기 위해 32비트의 x86 아키텍처를 x86_32로 표기하는 경우도 있다.

   

[ x86_364 ]

AMD에서 설계한 x86 상위호환의 64비트 프로세서 아키텍처. AMD64라고도 함.

인텔도 동일한 아키텍처를 채택하고 있다. EM64T는 인텔에서 사용하는 제품명.

   

[ 인라인 어셈블리 코드(inline assembly code) ]

C와 같은 고급언어 프로그램에 삽입된 어셈블리 코드를 일컬음.

아키텍처 의존적인 처리, 최적화 등에 사용된다.

   

[ 엔디안(endian) ]

여러 바이트로 된 데이터를 어떤 순서로 저장할지를 정하는 규칙.

바이트 순서라고도 함. 엔디안이라는 명칭은 걸리버 여행기에서 유래함.

   

[ 오브젝트 파일(object file) ]

컴파일러가 생성한 중간 단계 파일.

실행 파일이나 라이브러리는 오브젝트 파일을 링크해서 만든다.

GNU/리눅스에서는 .o라는 확장자를 갖는다.

넓은 의미로는 실행 파일이나 라이브러리도 오브젝트 파일에 포함하기도 한다.

   

[ 역어셈블(disassemble) ]

기계어를 어셈블리어로 변환하는 것.

   

[ 공유 라이브러리(shared library) ]

프로그램 실행 중 메모리상에서 여러 프로그램에 의해 공유되는 라이브러리.

통상 공유 라이브러리는 동적 링크된다. 정적 링크되는 공유 라이브러리도 있으나 드물다.

공유 오브젝트라고도 함.

   

[ 재배치(relocation) ]

기계어 코드에 포함된 주소를 링크 시에 또는 로드 시에 수정하는 것.

   

[ 시그널(signal) ]

프로세스에 보내지는 동기적인 또는 비동기적인 이벤트.

POSIX에서는 SIGKILL과 SIGSTOP외의 시그널은 시그널 핸들러로 처리할 수 있다.

   

[ 시그널 핸들러(signal handler) ]

시그널을 처리하는 함수. sigaction() 또는 signal() 함수로 설정할 수 있다.

   

[ 시그니처(signature) ]

이름, 인수, 반환 값의 형태에 따라 결정되는 함수의 형식.

보통 C나 C++ 등의 컴파일 언어에서는 이름이 같아도

시그니처가 다른 함수를 호출하려 하면 경고 또는 에러가 발생한다.

   

[ 시스템콜(system call) ]

유저 레벨의 애플리케이션에서 OS 커널의 기능을 호출하기 위한 방법.

(예: open(), read(), fork(), signal())

   

[ 심볼(symbol) ]

일반적으로는 기호를 의미하지만,

Binary Hacks의 문맥에서는 링커가 함수나 변수를 식별할 때 사용하는 이름을 말한다.

   

[ 심볼 테이블(symbol table) ]

오브젝트 파일 등에 포함된 심볼의 표.

명시적으로 삭제하지 않는 한 실행 파일이나 라이브러리에 남아 있다.

   

[ 스택(stack) ]

스택 프레임을 단계적으로 쌓아가는 메모리 영역. Binary Hacks의 문맥상

스택은 「데이터 구조의 스택」이 아니라 「메모리 영역의 스택」을 가리키는 경우가 많다.

   

[ 스택 프레임(stack frame) ]

인수나 지역 변수, 보존된 레지스터, 반환 값 주소 등 함수호출에 필요한 정보를 정리한 것.

간단히 프레임이라고도 한다.

   

[ 스택 포인터(stack pointer) ]

스택 프레임을 조작하기 위해 사용하는 포인터.

x86등은 스택 포인터를 위한 전용 레지스터를 갖고 있다.

RISC 프로세서에서는 범용 레지스터 중에 하나를 스택 포인터로 정해서 사용하는 경우가 많다.

   

[ 스레드(thread) ]

프로그램 실행 단위의 하나.

프로세스와의 주된 차이점은 자원 공유 방법에 있다.

통상, 프로세스에 비해 스레드 간 자원 공유가 더 쉽다.

하나의 프로세스는 여러 스레드를 갖는다.

   

[ 스레드 안전(thread safe) ]

멀티스레드 프로그램에서 안전하게 실행할 수 있음을 일컬음.

대개의 경우 static 변수를 내부에 지닌 함수는 스레드에 안전하지 않다.

   

[ 세그먼테이션 폴트(segmentation fault) ]

접근 불가한 주소 영역에 접근하거나 쓰기 불가능한 주소 영역에 쓰기를 할 경우 발생하는 에러.

C, C++ 프로그래머는 자주 접하게 된다. 세그먼트 위반이라고도 한다.

   

[ 실행 파일(executable file) ]

실행 가능한 파일. GNU/리눅스에서는 /bin, /usr/bin등에 있다.

   

[ 정적 라이브러리(static library) ]

정적 링크되는 라이브러리. GNU/리눅스에서는 .a라는 확장자를 갖는다.

   

[ 정적 링크(static link) ]

실행 파일을 생성할 때 라이브러리를 링크하는 것.

대개 라이브러리 내용을 실행 파일내에 포함시키기 때문에 실행 시에는 라이브러리 파일이 필요 없다.

   

[ 툴 체인(toolchain) ]

컴파일러, 링커, 어셈블러 등 네이티브 프로그램을 생성하기 위해 필요한 일련의 툴을 총칭.

   

[ 데이터 세그먼트(data segment) ]

초기화된 데이터가 위치하는 세그먼트. ELF에서의 명칭은 .data 이다.

   

[ 텍스트 세그먼트(text segment) ]

기계어 코드가 위치하는 세그먼트.

통상, read-only로 설정된다. ELF에서의 명칭은 .text 이다.

   

[ 디버거(debugger) ]

프로그램 버그의 원인을 찾는 데 유용한 툴.

디버거로 프로그램을 구동시킨 후 백트레이스나 변수 조사 등을 수행한다.

   

[ 디버그 정보(debug information) ]

디버거가 필요로 하는 정보. 실행 파일이나 공유 라이브러리에 포함되어 있다.

gcc에서는 -g 옵션을 주면 생성.

   

[ demangle ]

name mangling된 심볼을 원래의 읽기 쉬운 심볼로 복원시키는 것을 말함.

(예: _ZN3Foo3BarE => Foo::Bar)

   

[ 동적 링크(dynamic link) ]

실행 시에 라이브러리를 링크하는 것.

실행 시에 라이브러리 파일이 필요함. 라이브러리가 존재하지 않으면 실행 시에 에러가 발생한다.

   

[ 동적 링크 라이브러리(dynamic link library) ]

동적 링크된 라이브러리. 윈도우에서는 DLL이라 불린다.

GNU/리눅스에서는 DSO라고 불리는 경우가 많다.

   

[ name mangling ]

함수명과 시그니처로부터 유일한 심볼을 생성하는 것을 말함.

C++나 자바(Java)등의 언어에서 사용된다. (예: Foo::Bar => _ZN3Foo3BarE)

   

[ 바이너리안(binarian) ]

Binary Hack에 정통한 엔지니어.

   

[ 백트레이스(backtrace) ]

현재 함수에 도달할 때까지 지나온 함수를 추적하는 것. 스택 트레이스라고도 함.

   

[ 힙(heap) ]

malloc() 등에 의해 동적으로 확보된 메모리 영역.

Binary Hack의 문맥상으로 힙은 「데이터 구조의 힙」이 아니라 「메모리 영역의 힙」을 가리킨다.

자유기억 영역 이라고도 함.

   

[ 중단점(break point) ]

디버거로 프로그램 실행을 일시 중지시킬 지점. 함수명이나 소스코드의 행 번호로 지정한다.

   

[ 프로그램 카운터(program counter) ]

CPU내의 레지스터 중 하나로, 현재 실행하고 있는 명령의 주소를 저장하고 있다.

PC로 줄여서 일컫기도 함. 인스트럭션 포인터라고도 함.

   

[ 프로세스(process) ]

프로그램 실행 단위의 하나. 실행 중인 프로그램의 인스턴스.

통상, 프로세스는 하나의 프로세스 ID를 갖는다.

   

[ 프로파일러(profiler) ]

프로그램의 성능을 분석하는 툴. (이 책에서는 gprof, sysprof, oprofile을 소개한다.)

   

[ 호출 규약(calling convention) ]

함수를 호출할 때 데이터를 어떤 식으로 스택에 쌓을지를 정하는 규약.

ABI의 일종. OS나 프로세서에 따라 다르다.

   

[ 런타임(runtime) ]

실행 시를 뜻함. 실행 시에 발생하는 에러를 런타임 에러라고 한다.

   

[ 링크(link) ]

오브젝트 파일이나 라이브러리를 연결하는 것. 재배치 등의 처리를 수행한다.

   

[ 리플렉션(reflection) ]

실행 중인 프로그램 자신의 정보를 조사하거나 수정하는 것을 말함.

C언어 에서는 리플렉션을 위한 기능은 없지만, Binary Hack을 이용하기에 따라 유사한 기능을 구현할 수 있다.

   

[ 로드(load) ]

실행 파일이나 라이브러리를 메모리상에 배치하는 것.

Posted by devanix
2011. 6. 29. 12:26

BINARYHACKS:해커가전수하는테크닉100선
카테고리 컴퓨터/IT > 네트워크/보안 > 보안/인증/해킹
지은이 타카바야시 사토루 (아이티씨, 2007년)
상세보기


♧ 이 책에서 주로 GNU Binary Utilities에 대한 간략한 테크닉과
 
gcc 기반의 Linux(or Unix)에서 각종 버그를 찾는 방법들을 다루고 있다.
 
저수준에 대한 접근 문제 해결능력을 키울 수 있는 서적인 듯 하다.


   

목차 :

1장 소개 1

2장 오브젝트 파일 Hack 21

3장 GNU 프로그래밍 Hack 93

4장 보안 프로그래밍 Hack 177

5장 런타임 Hack 245

6장 프로파일러쪾디버거 Hack 379

7장 그 밖의 Hack 399

Posted by devanix
2011. 6. 29. 04:46

[ Problem ] - http://huge:file@www.pythonchallenge.com/pc/return/evil.html

♧ 카드 패를 5장씩 돌리고 있습니다. (타이틀은 dealing evil)

♧ 소스를 보면 evil1.jpg 링크가 걸려 있습니다. (이번 문제에만 숫자가 붙어 있습니다)

♧ 해당 그림의 패를 돌리는 모습을 연상하여 숫자를 증가 시켜 보면('evil2.jpg', 'evil3.jpg')

다음과 같은 그림 힌트가 주어 집니다.

♧ evil2.jpg를 보면 'not jpg-_.gfx' 메시지가 보입니다.
evil2.jpg를 -> evil2.gfx로 변경해 보면 evil2.gfx 파일을 받을 수 있습니다.

(
※ 참고로 evil4.jpg에는 빈 화면이 보이는데 이것을 편집기로 보면 'Bert is evil! go back!'
라는 메시지가 보인다. 이것은 다음 문제에 관련 되어 있다.)

 

♧ 해당 타이틀과 그림의 힌트를 다시 상기시키며

다음과 같이 'evil2.gfx' 파일을 5개의 파일로 각각 한 Byte씩 나눠 저장 합니다.

# encoding=utf8
from PIL import Image
from cStringIO import StringIO

# ① 해당 gfx 파일을 오픈.
im_file = open("evil2.gfx", 'rb').read()

# ② 해당 gfx파일을 각각 한 Byte씩 5개의 파일로 나눠서 저장.
for i in range(5):
    priece = im_file[i::5]
    im = Image.open(StringIO(priece))
    f = open(("%d.%s" % (i, im.format)), 'wb')
    f.write(priece)
    f.close()

   

♧ 'evil2.gfx'를 5분할 한 결과 입니다.

   

♧ 해당 그림의 단어를 연결해 보면 'disproportionality'에서

'ity'빼면 'disproportional'이 됩니다.

   

[ Solution ] - http://huge:file@www.pythonchallenge.com/pcc/return/disproportional.html 
( 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix
2011. 6. 28. 02:05

[ Problem ] - http://huge:file@www.pythonchallenge.com/pc/return/5808.html

♧ 흐릿한 이미지가 보인다. (해당 타이틀을 보면 "odd-even" 홀수/짝수에 대한 힌트가 주어진다.)
♧ 해당 이미지를 PIL의 getpixel()로 픽셀 값을 읽어 보면 홀/짝 순으로 번갈아 가며 특정한 패턴이 보인다.

   

♧ 해당 픽셀 값을 짝수로 읽어보면 다음과 같다.

# encoding=utf8
import urllib, StringIO
from PIL import Image, ImageDraw

# ① 이미지 파일 오픈.
url = 'http://huge:file@www.pythonchallenge.com/pc/return/cave.jpg'
u_img = urllib.urlopen(url).read()
im = Image.open(StringIO.StringIO(u_img))

# ② 짝수번째 픽셀을 저장할 빈 이미지 생성.
even_im = Image.new('RGB', (im.size[0], im.size[1]))

# ③ 해당 이미지의 짝수번째 픽셀값만 even_im에 변경하여 그리기.
for x in range(im.size[0]):
    for y in range(im.size[1]):
        if (x+y)%2 == 0:
            even_im.putpixel((x, y), im.getpixel((x,y)))

# ④ 해당 이미지를 반으로 출력. (320x240)
even_im.resize((320,240)).show()

   

♧ 출력 화면을 보면 오른쪽 위에 흐릿하게 'evil'이란 단어가 보인다.

  

   

[ Solution ] - http://www.pythonchallenge.com/pcc/return/evil.html

(※ 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix
2011. 6. 27. 09:52

[ 저장 및 종료 ]

[ex모드]

[설명]

:w

저장

:w file.txt

file.txt 파일로 저장

:w >> file.txt

file.txt 파일에 덧붙여서 저장

:q

vi 종료

:q!

vi 강제 종료

ZZ

저장 후 종료

:wq!

강제 저장 후 종료

:e file.txt

file.txt 파일을 불러옴

:e

현재 파일을 불러옴

   

[ 입력모드 전환 ]

[명령모드]

[설명]

[명령모드]

[설명]

a

커서 윈치 다음 칸부터 입력

A

커서 행의 맨 마지막부터 입력

i

커서의 위치에 입력

I

커서 행의 맨 앞에서부터 입력

o

커서의 다음 행에 입력

O

커서의 이전 행에 입력

s

커서 위치의 한 글자를 지우고 입력

S(cc)

커서 위치의 한 행을 지우고 입력

   

[ 이동 ]

[명령]

[설명]

[명령]

[설명]

H

왼쪽으로 이동(←)

l

오른쪽으로 이동(→)

j

아래 행으로 이동(↓)

k

위 행으로 이동(↑)

w or W

다음 단어의 첫 글자로 이동

b or B

이전 단어의 첫 글자로 이동

e or E

단어의 마지막 글자로 이동

<CR>

다음 행의 첫 글자로 이동

^

그 행의 첫 글자로 이동

$

그 행의 마지막 글자로 이동

+

다음 행의 첫 글자로 이동

-

위 행의 첫 글자로 이동

(

이전 문장의 첫 글자로 이동

)

다음 문장의 첫 글자로 이동

{

이전 문단으로 이동

}

다음 문단으로 이동

H

커서를 화면의 맨 위로 이동

z<CR>

현재 행을 화면의 맨 위로 이동

M

커서를 화면의 중앙으로 이동

z.

현재 행을 화면의 중앙으로 이동

L

커서를 화면 최하단으로 이동

z-

현재 행을 화면의 최하단으로 이동

[n]H

커서를 위에서 n행으로 이동

[n]L

커서를 아래에서 n행으로 이동

<Ctrl>+u

반 화면 위로 스크롤

<Ctrl>+d

반 화면 아래로 스크롤

<Ctrl>+b

한 화면 위로 스크롤

<Ctrl>+f

한 화면 아래로 스크롤

gg, 1G

문서의 맨 첫 행으로 이동

G

문서의 맨 마지막 행으로 이동

[n]G

n행으로 이동

:[n]<CR>

n행으로 이동

   

[ 삭제 ]

[명령모드]

[설명]

x, dl

커서 위치의 글자 삭제

X, dh

커서 바로 앞의 글자 삭제

dw

한 단어를 삭제

d0

커서 위치부터 행의 처음까지 삭제

D, d$

커서 위치부터 행의 끝까지 삭제

dd

커서가 있는 행을 삭제

dj

커서가 있는 행과 그 다음 행을 삭제

dk

커서가 있는 행과 그 앞 행을 삭제

   

[ 복사 & 붙이기 ]

[명령모드]

[설명]

[명령모드]

[설명]

yy

커서가 위치한 한 행 복사

p

붙여넣기

[n]yy

커서가 위치한 이후로 n행 복사

[n]p

n번만큼 붙여넣기 반복

   

[ 블록 지정 관련 ]

[명령]

[설명]

[명령]

[설명]

v

블록 지정

<Ctrl>+v

비쥬얼 블록 지정

~

대소문자 전환

d

삭제

y

복사

c

치환

>

행 앞에 탭 삽입

<

행 앞에 탭 제거

:

선택된 영역에 대하여 ex명령

J

행을 합침

U

대문자로 만듦

u

소문자로 만듦

   

[ 문자열 탐색 및 치환 ]

[ex모드]

[설명]

/[문자열]

문자열을 탐색

:s/old/new

현재 행의 처음 old를 new로 교체

:s/old/new/g

현재 행의 모든 old를 new로 교체

:10,20s/old/new/g

10행부터 20행까지 모든 old를 new로 교체

:-3,+4s/old/new/g

현재 커서 위치에서 3행 위부터 4행 아래까지 old를 new로 교체

:%s/old/new/g

문서 전체에서 old를 new로 교체

:%s/old/new/gc

문서 전체에서 old를 new로 확인하며 교체

:g/pattern/s//new/g

:%s/old/new/g와 동일

 

[ vim 정규 표현식 ]

[메타문자]

[설명]

[메타문자]

[설명]

^

행의 첫 문자([]안에서는 not의 의미)

$

행의 끝

.

아무 문자나 한 문자 의미

\|

or의 의미

[ ]

[]사이의 문자 중 하나

\{min,max\}

min 이상 max 이하 반복됨

*

앞의 내용이 0번 이상 반복됨

\+

앞의 내용이 1번 이상 반복됨

\<

단어의 시작

\>

단어의 끝

\n

새 행 문자

\t

탭 문자

 

[ vim 확장 정규 표현 문자열 ]

[이스케이프]

[설명]

\i (소문자 아이)

변수 지정에 사용되는 문자들 [_0-9A-Za-z]

\I (대문자 아이)

\i와 같지만 숫자는 제외

\k

keyword로 사용하는 문자 [_\.\-0-9A-Za-z]

\K

\k와 같지만 숫자는 제외

\f

파일 이름으로 사용하는 문자

\F

\f와 같지만 숫자는 제외

\p

프린트 가능한 문자

\P

\p와 같지만 숫자는 제외

\s

whitespace character(공백과 탭)

\S

non-whitespace character

\d

숫자 [0-9]

\D

숫자가 아닌 문자 [^0-9]

\x

16진수 숫자 [0-9A-Fa-f]

\X

16진수 숫자가 아닌 문자 [^0-9A-Fa-f]

\o

8진수 숫자 [0-7]

\O

8진수 숫자가 아닌 문자 [^0-7]

\w

영문 단어에서 사용되는 문자 [0-9A-Za-z-]

\W

영문 단어에서 사용되지 않는 문자 [^0-9A-Za-z-]

\h

영문 단어의 시작에 사용되는 문자 [A-Za-z-]

\H

영문 단어의 시작에 사용되지 않는 문자 [^A-Za-z-]

\a

모든 알파벳 [A-Za-z]

\A

알파벳이 아닌 문자 [^A-Za-z]

\l (소문자 엘)

소문자 [a-z]

\L

소문자가 아닌 문자 [^a-z]

\u

대문자 [A-Z]

\U

대문자가 아닌 문자 [^A-Z]

\e

<ESC>

\t

<TAB>

\r

캐리지 리턴 (CR)

\b

백스페이스(BS)

\n

새 행(LF)

   

[ POSIX 문자 클래스 ]

[문자 클래스]

[내용]

[:alnum:]

알파벳과 숫자 [A-Za-z0-9]

[:alpha:]

알파벳 [A-Za-z]

[:cntrl:]

제어 문자

[:blank:]

탭과 공백 문자

[:digit:]

숫자 [0-9]

[:graph:]

제어 문자와 공백 문자를 제외한 문자

[:lower:]

소문자 [a-z]

[:upper:]

대문자 [A-Z]

[:print:]

제어 문자를 제외한 문자. 즉 프린터 할 수 있는 문자

[:punct:]

[:graph:] 문자 중 [:alnum:]을 제외한 문자. (ex: !, @, #, $, %, ^....)

[:space:]

화이트 스페이스 (ex: 공백, 탭, 캐리지 리턴, 새 행, 수직 탭, 폼 필드)

[:xdigit:]

16진수

   

[ 파일 버퍼 관련 명령 요약 ]

[ex모드]

[설명]

:buffers

버퍼의 내용을 나열

:files or :ls

버퍼의 내용을 나열

:b[n]

n번 버퍼로 이동

:bd[N]

n 버퍼를 삭제(n이 없으면 현재의 버퍼를 완전 삭제)

:bw[n]

n 버퍼를 완전 삭제(n이 없으면 현재의 버퍼를 완전 삭제)

:bp[n]

이전 버퍼로 이동. n을 붙이면 n번만큼 이전 버퍼로 이동

:bn[n]

이후 버퍼로 이동. n을 붙이면 n번만큼 이후 버퍼로 이동

:sb[n]

창을 수평 분할하여 n번 버퍼를 로드

:bf

첫 번째 버퍼로 이동

:bl

마지막 버퍼로 이동

:al

현재 열려 있는 모든 버퍼를 수평 분할 창에 로드

   

[ 마킹 및 마킹한 위치로 이동 ]

[명령모드]

[설명]

[명령모드]

[설명]

ma

a로 마킹, mb는 b로 마킹...

  

  

`a

a로 마킹된 위치로 돌아감

'a

a로 마킹된 행의 처음으로 돌아감

' '

직전에 커서가 위치하던 행의 처음

` `

진전의 커서 위치로 이동

' "

이전에 vim으로 현재 파일을 닫았을 때 커서가 있던 행의 처음으로 이동

` "

이전에 vim으로 현재 파일을 닫았을 때 커서가 있던 위치로 이동

   

[ 다중 창 관련 명령 ]

-[ 창 생성 ]-

[명령모드]

[ex모드]

[결과]

<Ctrl>+w s

:sp[plit]

현재 파일을 두 개의 수평 창으로 나눔

<Ctrl>+w v

:[n]vs[plit]

새로운 수직 창 생성, n이 붙으면 n칸 크기의 창 분할

<Ctrl>+w n

:new

새로운 수평 창 생성

<Ctrl>+w ^

  

수평 창으로 나누고 이전 파일의 오픈

<Ctrl>+w f

  

창을 수평으로 나누고 커서 위치의 파일을 오픈

<Ctrl>+w i

  

커서 위치의 단어가 정의된 파일을 오픈

-[ 창 삭제 ]-

<Ctrl>+w q

:q[uit]!

현재 커서의 창을 종료

<Ctrl>+w c

:clo[se]

현재 커서의 창을 닫음

<Ctrl>+w o

:on[ly]

현재 커서의 창만 남기고 모든 창 삭제

-[ 창 이동 ]-

<Ctrl>+wh

  

왼쪽 창으로 커서 이동

<Ctrl>+wj

  

아래쪽 창으로 커서 이동

<Ctrl>+wk

  

위쪽 창으로 커서 이동

<Ctrl>+wl

  

오른쪽 창으로 커서 이동

<Ctrl>+ww

  

창을 순차적으로 이동

<Ctrl>+wp

  

가장 최근에 이동한 방향으로 이동

<Ctrl>+wt

  

최상위 창으로 이동

<Ctrl>+wb

  

최하위 창으로 이동

-[ 창 위치 바꾸기 ]-

<Ctrl>+wr

  

순차적으로 창의 위치를 순환

<Ctrl>+wx

  

이전 창과 위치를 바꿈

-[ 창 크기 조정 ]-

<Ctrl>+w =

  

창의 크기를 모두 균등하게 함

<Ctrl>+w _

  

수평 분할에서 창의 크기를 최대화

<Ctrl>+w |

  

수직 분할에서 창의 크기를 최대화

<Ctrl>+w [n]+

:res[ize] +n

창의 크기를 n행만큼 증가 (Ctrl+w +는 1행만큼 증가)

<Ctrl>+w [n]-

:res[ize] -n

창의 크기를 n행만큼 감소 (Ctrl+w -는 1행만큼 증가)

<Ctrl>+w [n]>

  

창의 크기를 오른쪽으로 n칸만큼 증가(수직 창에 한함)

<Ctrl>+w [n]<

  

창의 크기를 왼쪽으로 n칸만큼 증가(수직 창에 한함)

   

[ ctags 관련 명령 ]

[ex모드]

[설명]

:ta [tag] or <Ctrl>+]

[tag]가 정의된 위치를 나열하고 선택한 위치로 점프. 현재 위치는 stack에 push된다.

:ts [tag] or :서 [tag]

:po or <Ctrl>+t

stack top에 저장된 위치를 pop하고 그 위치로 점프

:sts [tag]

[tag]가 정의된 위치를 나열하고 선택한 위치로 창을 수평 분할하여 새로 생성된 창에 표시

:stj [tag]

:tn

tj나 ts로 점프했을 때 다음 tag로 점프

:tp

tj나 ts로 점프했을 때 이전 tag로 점프

:tr

tj나 ts로 점프했을 때 처음 tag로 점프

:tl

tj나 ts로 점프했을 때 마지막 tag로 점프

:pts [tag]

[tag]가 정의된 위치를 나열하고 선택한 위치로 창을 수평 분할하여 새로 생성된 창에 표시하지만 커서는 현재 위치에 유지

:ptj [tag]

미리보기 윈도우에 tag가 정의된 형식을 보임

:ptn

ptj나 pts로 점프했을 때 다음 tag로 점프

:ptp

ptj나 pts로 점프했을 때 이전 tag로 점프

:ptr

ptj나 pts로 점프했을 때 처음 tag로 점프

:ptl

ptj나 pts로 점프했을 때 마지막 tag로 점프

   

[ cscope 관련 명령 ]

:cs find {질의 종류} {심볼}
ex_) :cs find s start_kernel

0 or s

이 C symbol 찾기

1 or g

이 정의 찾기

2 or d

이 함수에 의해 불려지는 함수들 찾기

3 or c

이 함수를 부르는 함수들 찾기

4 or t

Find assignments to

6 or e

이 egrep 패턴 찾기

7 or f

이 파일 찾기

8 or i

이 파일을 포함하는 파일들 찾기

Posted by devanix
2011. 6. 27. 01:59

[ GCC 전역 옵션]

옵션

설명

-E

전처리 과정 화면에 출력

-S

어셈블리 파일 생성

-c

오브젝트 파일 생성

-v

컴파일 과정 화면에 출력

--save-tmps

컴파일 시 생성되는 중간 파일 저장

-da

컴파일 과정에서 생성되는 중간 코드 생성(RTL 파일 등 생성)

 

[ 전처리기(cpp0) 옵션]

옵션

설명

-l[패스]

헤더 파일을 탐색할 디렉토리 지정 (ex_: -l/opt/include)

-include[헤더 파일 패스]

해당 헤더 파일을 모든 소스 내 추가 (ex_: -include /root/my.h)

-D[매크로]

외부에서 #define 지정 (ex_: -DDEBUF)

-D[매크로]=[매크로 값]

외부에서 해당 매크로를 정의하고 값을 지정 (ex_: -DDEBUG=1)

-U[매크로]

외부에서 #endef 지정 (ex_ -UDEBUG)

-M 또는 -MM

make 기술 파일을 위한 소스 파일의 종속 항목 출력

-nostdinc

표준 C 헤더 파일을 include하지 않음

-C

전처리 과정에서 주석을 제거하지 않음

-Wp,[옵션 리스트]

옵션 리스트를 전처리기에 바로 전달

 

[ C컴파일러(cc1) 옵션]

- C 언어 옵션 -

옵션

설명

-ansi

ANSI C 문법으로 문법 검사

-std=[c 표준]

지정한 C 표준으로 문법 검사 (표준:c89, c99, gnu89, gnu99 등)

-traditional

K&R C문법으로 문법 검사

-fno-asm

asm, inline, typeof 키워드를 사용하지 않음(gnu89 문법 기준)

- 경고 옵션 -

-Wall -W

모든 경고 메시지 출력

-w

모든 경고 메시지 제거

-Werror

모든 경고를 오류로 취급하여 컴파일 중단

-pedantic

C89 표준에서 요구하는 모든 경고 메시지를 표시

-pedantic-errors

C89 표준에서 요구하는 모든 오류 메시지를 표시

-Wtraditional

ANSI C와 K&R C 간에 서로 다른 결과를 가져올 수 있는 부분이 있다면 경고

- 최적화 옵션 -

-O0

아무런 최적화를 수행치 않음

-O1 또는 -O

최적화 레벨 1 수행

-O2

최적화 레벨 2 수행

-O3

최적화 레벨 3 수행

-O4

사이즈 최적화 수행

- 디버깅 옵션 -

-g

바이너리 파일에 디버깅 정보 삽입

-pg

프로파일을 위한 코드 삽입

 

[ 어셈블리(as) 옵션]

옵션

설명

-Wa,[옵션 리스트]

어셈블러에게 옵션 리스트를 바로 전달

-Wa,-al

어셈블된 코드와 인스트럭션을 보임

-Wa,-as

정의된 심볼을 보임

 

[ 링크(ld) 옵션]

옵션

설명

-L[패스]

라이브러리 탐색 디렉토리 지정 (ex_: -L/opt/lib)

-l[라이브러리 이름]

해당 라이브러리를 링크 (ex_: -lm)

-shared

공유 라이브러리를 우선하여 링크

-static

정적 라이브러리를 우선하여 링크

-nostdlib

표준 C 라이브러리를 사용하지 않음

-Wl,[옵션 리스트]

옵션 리스트를 링크에 바로 전달

Posted by devanix