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 |