'2011/06'에 해당되는 글 40건
- 2011.06.29 [Hack #4] od - 바이너리 파일 덤프
- 2011.06.29 [Hack #3] file – 파일 종류 확인 1
- 2011.06.29 [Hack #2] Binary Hack 용어 정리 1
- 2011.06.29 [책소개] Binary Hacks
- 2011.06.29 [Python challenge Level12] – evil (dealing evil)
- 2011.06.28 [Python challenge Level11] - 5808 (odd-even)
- 2011.06.27 [VIM] 단축키 정리
- 2011.06.27 [gcc] 옵션 정리
♧ od는 octal dump(『octal』은 8진법을 뜻함)로, 기본적으로 바이너라 파일을 8진수로 덤프해서 출력.
[ 기본적인 8진수 덤프 ] |
⊙ 행 앞 첫 컬럼에 해당하는 숫자(밝은녹색 테두리 부분)는 시작점으로부터의 오프셋을 8진수로 표시한 것. (※ offset은 좌측 메모리 시작점을 0으로 하여 숫자를 통해 위치를 알려주는 좌표계 역할을 함) |
[ 출력 형식 지정 ] -t옵션(--format=TYPE) |
||||||||||||||||||||||||||||||||||||||||||||||
⊙ 일반적으로 8진수 보다 16진수로 표시되는 게 알기 쉽다.
(※ a,c → 바이트 단위로 출력)
⊙ 오프셋 표기도 8진수 외에 다른 형태로 표시할 수 있다. '-A 옵션'에 다음 지정자를 이용하면 오프셋의 기수를 변경할 수 있음.
⊙ 또한 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로 확인 하여 사용하자.
테스트 환경 :
'컴퓨터 서적 정리 > Binary Hacks' 카테고리의 다른 글
[Hack #6] 정적 라이브러리와 공유 라이브러리 (1) | 2011.07.02 |
---|---|
[Hack #5] Object file - ELF 파일 (0) | 2011.07.01 |
[Hack #3] file – 파일 종류 확인 (1) | 2011.06.29 |
[Hack #2] Binary Hack 용어 정리 (1) | 2011.06.29 |
[책소개] Binary Hacks (0) | 2011.06.29 |
♧ 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명령이 파일 종류를 판별 하는 순서] |
① 디바이스, 디렉토리, 심볼릭 링크 등의 스페셜 파일 체크 |
위의 어떤 경우에도 해당하지 않으면 단순 바이너리 파일로 판단. |
[ magic 데이터베이스에는 시그니처 정보가 기록 ] |
||||
♧ magic 파일 경로 ⊙ /etc/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 참조)
'컴퓨터 서적 정리 > Binary Hacks' 카테고리의 다른 글
[Hack #6] 정적 라이브러리와 공유 라이브러리 (1) | 2011.07.02 |
---|---|
[Hack #5] Object file - ELF 파일 (0) | 2011.07.01 |
[Hack #4] od - 바이너리 파일 덤프 (0) | 2011.06.29 |
[Hack #2] Binary Hack 용어 정리 (1) | 2011.06.29 |
[책소개] Binary Hacks (0) | 2011.06.29 |
[ 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) ]
실행 파일이나 라이브러리를 메모리상에 배치하는 것.
'컴퓨터 서적 정리 > Binary Hacks' 카테고리의 다른 글
[Hack #6] 정적 라이브러리와 공유 라이브러리 (1) | 2011.07.02 |
---|---|
[Hack #5] Object file - ELF 파일 (0) | 2011.07.01 |
[Hack #4] od - 바이너리 파일 덤프 (0) | 2011.06.29 |
[Hack #3] file – 파일 종류 확인 (1) | 2011.06.29 |
[책소개] Binary Hacks (0) | 2011.06.29 |
|
♧ 이 책에서 주로 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 |
'컴퓨터 서적 정리 > Binary Hacks' 카테고리의 다른 글
[Hack #6] 정적 라이브러리와 공유 라이브러리 (1) | 2011.07.02 |
---|---|
[Hack #5] Object file - ELF 파일 (0) | 2011.07.01 |
[Hack #4] od - 바이너리 파일 덤프 (0) | 2011.06.29 |
[Hack #3] file – 파일 종류 확인 (1) | 2011.06.29 |
[Hack #2] Binary Hack 용어 정리 (1) | 2011.06.29 |
[ 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.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
(※ 문제에 대한 다양한 해결법은 링크 참조.)
'워게임(WarGame) > PythonChallenge' 카테고리의 다른 글
[Python challenge Level14] - italy(walk around) (0) | 2011.11.21 |
---|---|
[Python challenge Level13] - disproportional (xmlrpclib) (0) | 2011.07.01 |
[Python challenge Level11] - 5808 (odd-even) (0) | 2011.06.28 |
[Python challenge Level10] - bull (개미수열) (0) | 2011.06.27 |
[Python challenge Level9] - good (ImageDraw) (0) | 2011.06.23 |
[ Problem ] - http://huge:file@www.pythonchallenge.com/pc/return/5808.html
♧ 흐릿한 이미지가 보인다. (해당 타이틀을 보면 "odd-even" 홀수/짝수에 대한 힌트가 주어진다.)
♧ 해당 픽셀 값을 짝수로 읽어보면 다음과 같다. # 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
(※ 문제에 대한 다양한 해결법은 링크 참조.)
'워게임(WarGame) > PythonChallenge' 카테고리의 다른 글
[Python challenge Level13] - disproportional (xmlrpclib) (0) | 2011.07.01 |
---|---|
[Python challenge Level12] – evil (dealing evil) (0) | 2011.06.29 |
[Python challenge Level10] - bull (개미수열) (0) | 2011.06.27 |
[Python challenge Level9] - good (ImageDraw) (0) | 2011.06.23 |
[Python challenge Level8] - integrity (bz2) (0) | 2011.06.23 |
[ 저장 및 종료 ]
[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 {질의 종류} {심볼} |
|
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 |
이 파일을 포함하는 파일들 찾기 |
'Essential Tools > VIM - Vi IMproved' 카테고리의 다른 글
Vim 편집기로 스크립트 작성하기 (0) | 2011.09.23 |
---|---|
[VIM Plugin] T-Commant (0) | 2011.09.22 |
[VIM Plugin] snipMate (0) | 2011.09.22 |
[VIMRC] Personal Vim Initializations (개인 환경 설정) (0) | 2009.12.20 |
[ 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,[옵션 리스트] |
옵션 리스트를 링크에 바로 전달 |
'Essential Tools' 카테고리의 다른 글
맨페이지 간단한 색상 추가해서 보기 (0) | 2011.10.25 |
---|---|
한장으로 보는 정규 표현식(Regular Expression) cheat sheet (0) | 2011.09.10 |
DJGPP 설정 (1) | 2011.05.08 |
[Port scanner] Nmap Security Scanner (0) | 2010.09.04 |
[토탈커맨더] Total Commander 단축키 (0) | 2010.05.09 |