자주 사용하는 shellcode를 -S 옵션으로 컴파일 한 결과 파일( inlineasm.s )

`` __volatile__``을 사용했기 때문에 입력한 어셈블리 그대로 컴파일 되었다.
```c
        .file   "inlineasm.c"
        .version        "01.01"
gcc2_compiled.:
.text
        .align 4
.globl main
        .type    main,@function
main:
        pushl %ebp
        movl %esp,%ebp
#APP
        push $0x0
        push $0x0068732f
        push $0x6e69622f
        mov %esp, %ebx
        push $0x0
        push %ebx
        mov %esp, %ecx
        mov $0x0, %edx
        mov $0xb, %eax
        int $0x80

#NO_APP
.L1:
        leave
        ret
.Lfe1:
        .size    main,.Lfe1-main
        .ident  "GCC: (GNU) egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)"
```
`` .s``파일은 컴파일러가 최적화 한 이후의 파일이기 때문에 파일 내용 그대로 실행파일이 만들어진다. 
따라서, `` objdump``의 출력과 `` .s``파일의 어셈블리는 `` .s``에서 주소 대신 symbol을 사용하는 것을 제외하면 동일하다.
`` .s``에서는 call이나 jmp 명령어의 인자로 주소 대신 func_name(symbol)을 사용한다.

또한 string이나 jmp point도 symbol로 사용한다. 


.s파일을 수정해 symbol을 새로 만들거나, symbol로 jmp나 call하도록 수정할 수 있다.

modified_inlineasm.s

```c
        .file   "inlineasm.c"
        .version        "01.01"
gcc2_compiled.:
.section        .rodata
.LC0:
        .string "/bin/sh"
.text
        .align 4
.globl main
        .type    main,@function
main:
        pushl %ebp
        movl %esp,%ebp
        jmp begin

begin2:
        mov $.LC0, %ebx
        push $0x0
        push %ebx
        mov %esp, %ecx
        mov $0x0, %edx
        mov $0xb, %eax
        int $0x80

begin:
        call begin2

#NO_APP
.L1:
        leave
        ret
.Lfe1:
        .size    main,.Lfe1-main
        .ident  "GCC: (GNU) egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)"
```


inlineasm의 objdump

```c
...

08048398 <main>:
 8048398:       55                      push   %ebp
 8048399:       89 e5                   mov    %esp,%ebp
 804839b:       eb 16                   jmp    80483b3 <begin>

0804839d <begin2>:
 804839d:       bb 10 84 04 08          mov    $0x8048410,%ebx
 80483a2:       6a 00                   push   $0x0
 80483a4:       53                      push   %ebx
 80483a5:       89 e1                   mov    %esp,%ecx
 80483a7:       ba 00 00 00 00          mov    $0x0,%edx
 80483ac:       b8 0b 00 00 00          mov    $0xb,%eax
 80483b1:       cd 80                   int    $0x80

080483b3 <begin>:
 80483b3:       e8 e5 ff ff ff          call   804839d <begin2>
 80483b8:       c9                      leave
 80483b9:       c3                      ret
 80483ba:       90                      nop
 80483bb:       90                      nop

...
```

Note) 인라인 어셈블리 대신 .s파일을 바로 작성해도 인라인 어셈블리와 동일하게 사용할 수 있다.


'OS > LINUX & UNIX' 카테고리의 다른 글

ptrace  (0) 2016.12.25
[excp] 읽기 권한 없는 파일 복사하기  (0) 2016.12.21
GOT( Global Offset Table ) Layout과 link_map structure  (0) 2016.12.09
[Linux] Memory Layout, Segment + Kernel  (0) 2016.11.21
[compile process] Shared Library  (0) 2016.11.21