본문 바로가기
Dreamhack/pwn

Calling Convention Quiz

Q1. 아래 코드를 컴파일 했을 때, 컴파일된 어셈블리 코드 중 (a)에 들어갈 것으로 가장 적절할 것을 고르시오.

 

Q2. 아래 코드를 컴파일 했을 때, 컴파일된 어셈블리 코드 중 (b)에 들어갈 것으로 가장 적절할 것을 고르시오.

 

Q3. 아래 코드를 컴파일 했을 때, 컴파일된 어셈블리 코드 중 (c)에 들어갈 것으로 가장 적절할 것을 고르시오.

 

Q4. 아래 코드를 컴파일 했을 때, 컴파일된 어셈블리 코드 중 (d)에 들어갈 것으로 가장 적절할 것을 고르시오.

 

// Name: callconv_quiz.c
// Compile: gcc -o callconv_quiz callconv_quiz.c -m32
int __attribute__((cdecl)) sum(int a1, int a2, int a3){
	return a1 + a2 + a3;
}
void main(){
	int total = 0;
	total = sum(1, 2, 3);
}
main:   
   0x080483ed <+0>:	push   ebp
   0x080483ee <+1>:	mov    ebp,esp
   0x080483f0 <+3>:	sub    esp,0x10
   0x080483f3 <+6>:	mov    DWORD PTR [ebp-0x4],0x0
   0x080483fa <+13>:	(a)
   0x080483fc <+15>:	(b)
   0x080483fe <+17>:	(c)
   0x08048400 <+19>:	call   0x80483db <sum>
   0x08048405 <+24>:	(d)
   0x08048408 <+27>:	mov    DWORD PTR [ebp-0x4],eax
   0x0804840b <+30>:	nop
   0x0804840c <+31>:	leave  
   0x0804840d <+32>:	ret​

 

C 언어에서는 1,2,3 순서로 함수에 넘기지만 x86-64에서는 Stack 구조를 사용하기 때문에 가장 나중에 전달한 인자가 가장 먼저 stack에 push 된다. 

a: push 0x3 
b: push 0x2 
c: push 0x1

 

Integer 3개(12 bytes)를 stack에 넣기 때문에 stack frame을 12(0xc) byte 만큼 늘려야 한다.  

add esp,0x10

 

Q5. SYSV를 적용하여 아래 코드를 컴파일 했을 때, 컴파일된 어셈블리 코드 중 (a)에 들어갈 것으로 가장 적절한 것을 고르시오.

 

SYSV는에서 함수의 argument들은 rdi, rsi, rdx, rcx, r8, r9 register를  순서대로 사용한다. 

a에는 3이 들어간다. 3은 3번째 argument이기 때문에 rdx(edx)를 이용한다.

mov edx, 0x3

 

Q6. SYSV를 적용하여 아래 코드를 컴파일 했을 때, 컴파일된 어셈블리 코드 중 (b)에 들어갈 것으로 가장 적절한 것을 고르시오.

 

b에는 2가 들어간다. b는 2번째  argument이기 때문에 rsi(esi)를 이용한다. 

 

mov esi, 0x2

 

Q7. SYSV를 적용하여 아래 코드를 컴파일 했을 때, 컴파일된 어셈블리 코드 중 (c)에 들어갈 것으로 가장 적절한 것을 고르시오.

 

c에는 1이 들어간다. 1은 첫 번째 argument이기 때문에 rdi(edi)를 이용한다. 

mov edi, 0x1

'Dreamhack > pwn' 카테고리의 다른 글

basic_exploitation_000  (1) 2024.11.15
Return Address Overwrite  (0) 2024.11.15
shell_basic  (1) 2024.11.15
Shellcode Quiz  (1) 2024.11.12
Computer Architecture Quiz  (0) 2024.11.11