ABI (Application Binary Interface)
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 |