ABI (Application Binary Interface)

2009. 3. 17. 17:13

*      ABI(Application Binary Interface)

 

ABI는 응용 프로그램과 운영체제, 또는 응용 프로그램과 라이브러리 사이에 필요한 저 수준 인터페이스를 정의한다. API(Application Programing Interface)와 비슷하지만 ABI는 바이너리 호환성을 가능하게 하고 API는 소스코드 호환성을 제공한다. 예를 들어 POSIX 표준은 API는 일반 산술함수가 여러 다른 시스템에서 작동하게 쓰여질 수 있는 것을 허락한다고 정의한다. 그러나 API의 사용은 각각의 플랫폼에서 재편집(리컴파일)을 요구한다. 반면에 호환성 있는 ABI는 컴파일된 오브젝트 코드가 어떤 수정 없이도 작동하는 것을 가능하게 한다. ABI는 함수의 인자들과 리턴값이 어떻게 넘겨지고 반환되는지를 다루는 호출 규약(Calling Convention)을 자세하게 다룬다.

 

< C source >

#include <stdio.h>

 

int add(int a, int b, int c, int d, int e, int f);

 

int main(void)

{

 

   int result = add(1, 2, 3, 4, 5, 6);

 

   printf("\n%d\n",result);

   return 0;

}

 

 

int add(int a, int b, int c, int d, int e, int f)

{

        int x;

        x = a + b + c+ d + e + f;

        return x;

}

< ASM source >

0x080483b4 <main+0>:    push   %ebp              프롤로그 : 이전 FP를 스택에 푸쉬

0x080483b5 <main+1>:    mov    %esp,%ebp       현재 esp FP

0x080483b7 <main+3>:    sub    $0x28,%esp       지역변수를 위한 공간확보

0x080483ba <main+6>:    and    $0xfffffff0,%esp   스택을 16bit boundry에 맞춘다

0x080483bd <main+9>:    mov    $0x0,%eax

0x080483c2 <main+14>:   add    $0xf,%eax

0x080483c5 <main+ni17>:   add    $0xf,%eax

0x080483c8 <main+20>:   shr    $0x4,%eax

0x080483cb <main+23>:   shl    $0x4,%eax

0x080483ce <main+26>:   sub    %eax,%esp

0x080483d0 <main+28>:   movl   $0x6,0x14(%esp)          우측부터 파라미터를 스택에 저장

0x080483d8 <main+36>:   movl   $0x5,0x10(%esp)         

0x080483e0 <main+44>:   movl   $0x4,0xc(%esp)

0x080483e8 <main+52>:   movl   $0x3,0x8(%esp)

0x080483f0 <main+60>:   movl   $0x2,0x4(%esp)

0x080483f8 <main+68>:   movl   $0x1,(%esp)

0x080483ff <main+75>:    call   0x8048421 <add>          add 함수 호출

                                                                     (호출 전 stack ret addr 집어넣는다)

 

0x08048404 <main+80>:   mov    %eax,0xfffffffc(%ebp)  리턴값을 ebp-4 (지역변수)에 저장

0x08048407 <main+83>:   mov    0xfffffffc(%ebp),%eax

0x0804840a <main+86>:   mov    %eax,0x4(%esp)      

0x0804840e <main+90>:   movl   $0x8048508,(%esp)

0x08048415 <main+97>:   call   0x80482d8 <printf@plt>

0x0804841a <main+102>:  mov    $0x0,%eax

0x0804841f <main+107>:  leave   에필로그(스택정리)        Leave :  mov ebp, esp

pop ebp

                                                    esp값을 현재의 ebp 가 있는 
        곳으로 이동시킨 후, stp pop해서 
        ebp
에 저장한다

0x08048420 <main+108>:  ret

 

Function add:

0x0804844c <add+0>:     push   %ebp                          프롤로그

0x0804844d <add+1>:     mov    %esp,%ebp

0x0804844f <add+3>:     sub    $0x4,%esp                    지역변수를 위한 공간할당

0x08048452 <add+6>:     mov    0xc(%ebp),%eax            

0x08048455 <add+9>:     add    0x8(%ebp),%eax            파라미터들을 더함

0x08048458 <add+12>:    add    0x10(%ebp),%eax

0x0804845b <add+15>:    add    0x14(%ebp),%eax

0x0804845e <add+18>:    add    0x18(%ebp),%eax

0x08048461 <add+21>:    add    0x1c(%ebp),%eax

0x08048464 <add+24>:    mov    %eax,0xfffffffc(%ebp)    더한값을 지역변수에 저장

0x08048467 <add+27>:    mov    0xfffffffc(%ebp),%eax

0x0804846a <add+30>:    leave

0x0804846b <add+31>:    ret

 
이걸 테스트한 환경이 기억나질 않네.. 헐..

'Sabzil' 카테고리의 다른 글

oracle sql injection with rownum  (0) 2011.09.01
Shellcode site  (0) 2009.09.29
hey JJAAPPPHH ~  (4) 2009.08.17
hey JaPH  (1) 2009.08.12
6회 kisa 해킹방어대회 6번  (0) 2009.07.09
Nefif_rx  (0) 2009.03.17
usleep에 대해서  (0) 2009.01.08
strtok_r  (0) 2008.09.29
this is RAM  (0) 2008.08.21
nit_if.h  (0) 2008.07.17

badcob Sabzil