Archive for 1월 2013

vim 간략 노트 base64 파일 다루기편

메일에서 많이 사용되는 인코딩 방식으로 base64가 있습니다.

base64인코딩을 openssl과 같이 사용하면서 발생했던 문제에 대하여 vim을 통해 간단히 작업한 내용을 메모해 둡니다.

메일을 받아보면 아래와 같은 base64 인코딩 영역이 있습니다.

Content-Type: text/html; charset=euc-kr
Content-Transfer-Encoding: base64

PGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0i
dGV4dC9odG1sOyBjaGFyc2V0PWV1Yy1rciI+DQo8dGl0bGU+vsiz58fPvLy/5C4gvcXH0cSrteXA
1LTPtNkuPC90aXRsZT4NCjwvaGVhZD4NCiANCjxib2R5Pg0KPCEtLUhlYWRlciBTdGFydCAtLT4N
Cjx0YWJsZSB3aWR0aD0iNzAwIiBib3JkZXI9IjAiIGFsaWduPSJjZW50ZXIiIGNlbGxwYWRkaW5n
PSIwIiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9ImJhY2tncm91bmQ6dXJsKGh0dHA6Ly9jYXJkaW1h
Z2Uuc2hpbmhhbmNhcmQuY29tL2ltZy9lbWFpbC9jb21tb24vMjAxMTExL2JnX0hlYWRlcl9iYXNp

위 내용은 줄바꿈문자를 있는 그대로 붙여 넣은 것입니다.

한 줄의 문자수가 77개 입니다. 위 내용의 경우는 openssl enc -d -a 명령을 통해 정상적으로 디코드하여 볼 수 있었습니다.

하지만, openssl에서 base64인코딩을 하면 보통, 한 줄이 64자리인 것을 많이 봅니다.

그래서, 이번에는 위와 같이 줄의 문자수가 맞지 않을 때, 줄을 맞추는 vim 명령을 해봤습니다.

# 내용에서 줄바꿈 문자를 모두 제거하기
:%s/\n//
# 임의의 글자수를 찾고 찾은문자열 + 줄바꿈 문자로 대치하기
:%s/\(.\{64\}\)/\1\r/g

위 첫 번째 치환은 간단합니다. ‘\n’줄바꿈문자를 찾아서 ”로 대체합니다. 즉, 줄바꿈문자를 지워 한줄로 만듭니다.

두 번째 치환은 제가 잘 안해보던 것이라 좀 시간이 걸렸습니다.
1. ‘\(\)’ 임의의 찾은 문자열을 대체될 영역에서 사용할 때 사용하는 구문입니다. ‘\1’ 형태로 참조하여 사용했습니다.
2. ‘\{\}’ 바로 앞 문자(현재는 임의문자(‘.’))의 반복 횟수를 나타냅니다.

즉, 임의의 문자가 64번 반복되는 패턴을 찾은 후, ‘\1\r’형태로 해당문자와 줄바꿈문자로 대체하였습니다.

일부 메일에서 base64인코딩이지만, 글자수가 openssl과 호환되지 않는 형태로 오는 메일을 다뤄본 후 간단히 작업해본 vim 경험입니다.

ps. 검색어 : vim 문자반복 치환 문자갯수 줄바꿈

‘Head First Software Development’를 봅니다.

2013-001 – 2013/01/13 – Head First Software Development – 댄 필로네 & 러스 마일즈 – 공학 – 종이책 – 링크 – 읽는중

gcc로 몇가지 연습 -c -S -E

gcc로 c언어 컴파일을 몇 가지 실습해 보았습니다.

-c 옵션

gcc 명령에 -c 옵션을 주면, .c파일을 컴파일만하고 링크를 하지 않습니다. 결과물로는 .o 파일이 생성됩니다.

test.c 파일

int test(int a, int b) {
    return a + b;
}

int main(int argc, char* argv[]) {
    test(3,4);
    return 0;
}
[dgkim@dgkim asm]$ ls -al
합계 12
drwxr-xr-x   2 dgkim users 4096 2013-01-03 19:37 .
drwxrwxrwt. 18 root  root  4096 2013-01-03 19:34 ..
-rw-r--r--   1 dgkim users  112 2013-01-03 18:12 test.c
[dgkim@dgkim asm]$ gcc -c test.c
[dgkim@dgkim asm]$ ls -l
합계 8
-rw-r--r-- 1 dgkim users  112 2013-01-03 18:12 test.c
-rw-r--r-- 1 dgkim users 1464 2013-01-03 19:37 test.o
[dgkim@dgkim asm]$

-c 옵션으로 생성된 .o 파일을 gcc를 통해 링크하려면 아래와 같이 할 수 있습니다.
여러 개의 .c 파일을 가지는 프로그램 및 링크 과정 및 순서에 따라, -c 옵션으로 컴파일만하고, 마지막에 .o 파일들을 묶는 일은 자주 있을 것입니다.

[dgkim@dgkim asm]$ gcc -o test test.o
[dgkim@dgkim asm]$ ls -l
합계 16
-rwxr-xr-x 1 dgkim users 6379 2013-01-03 19:39 test
-rw-r--r-- 1 dgkim users  112 2013-01-03 18:12 test.c
-rw-r--r-- 1 dgkim users 1464 2013-01-03 19:37 test.o
[dgkim@dgkim asm]$

-S 옵션

gcc에서 -S 옵션을 주고 실행하면, .c파일에서 .s파일, 즉 어셈블러 소스가 생성됩니다.

[dgkim@dgkim asm]$ ls -al
합계 28
drwxr-xr-x   2 dgkim users 4096 2013-01-03 19:41 .
drwxrwxrwt. 18 root  root  4096 2013-01-03 19:39 ..
-rwxr-xr-x   1 dgkim users 6379 2013-01-03 19:39 test
-rw-r--r--   1 dgkim users  112 2013-01-03 18:12 test.c
-rw-r--r--   1 dgkim users 1464 2013-01-03 19:37 test.o
-rw-r--r--   1 dgkim users  807 2013-01-03 19:41 test.s
[dgkim@dgkim asm]$

위의 간단하고 짧던 .c 파일은 아래와 같은 복잡한 .s 파일을 만들었습니다.

        .file   "test.c"
        .text
.globl test
        .type   test, @function
test:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    %edi, -4(%rbp)
        movl    %esi, -8(%rbp)
        movl    -8(%rbp), %eax
        movl    -4(%rbp), %edx
        leal    (%rdx,%rax), %eax
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   test, .-test
.globl main
        .type   main, @function
main:
.LFB1:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        subq    $16, %rsp
        movl    %edi, -4(%rbp)
        movq    %rsi, -16(%rbp)
        movl    $4, %esi
        movl    $3, %edi
        call    test
        movl    $0, %eax
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE1:
        .size   main, .-main
        .ident  "GCC: (GNU) 4.4.6 20120305 (Red Hat 4.4.6-4)"
        .section        .note.GNU-stack,"",@progbits

-E 옵션

gcc에서 -E 옵션을 주면, preprocessor 처리가 된 c파일의 내용을 볼 수 있습니다.

preprocessor 처리를 위해서 test.c 파일에서 #define 사용하여 작은 수정을 한 결과입니다.

[dgkim@dgkim asm]$ cat test.c
#define a alpha
#define b bravo

int test(int a, int b) {
    return a + b;
}

int main(int argc, char* argv[]) {
    test(3,4);
    return 0;
}
[dgkim@dgkim asm]$ gcc -E test.c
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"



int test(int alpha, int bravo) {
    return alpha + bravo;
}

int main(int argc, char* argv[]) {
    test(3,4);
    return 0;
}
[dgkim@dgkim asm]$

ps. 다음에는 -m32 옵션을 통해서 x86_64 머신에서 x86 i686용 빌드를 테스트한 글을 올려볼까요? glibc-devel.i686
ps2. 그리고, gdb를 통해서 위 파일을 디버깅하였는데, 그 글도 올려볼까요?