[Quiz] x86 Assembly 2

·2023년 1월 18일
0

System Hacking

목록 보기
8/10

다음 어셈블리 코드를 실행했을 때 출력되는 결과로 올바른 것은?

[Code]
main:
    push rbp
    mov rbp, rsp
    mov esi, 0xf
    mov rdi, 0x400500
    call 0x400497 <write_n>
    mov eax, 0x0
    pop rbp
    ret
    
write_n:
    push rbp
    mov rbp, rsp
    mov QWORD PTR [rbp-0x8],rdi
    mov DWORD PTR [rbp-0xc],esi
    xor rdx, rdx
    mov edx, DWORD PTR [rbp-0xc]
    mov rsi,QWORD PTR [rbp-0x8]
    mov rdi, 0x1
    mov rax, 0x1
    syscall
    pop rbp
    ret
    
==================================    
[Memory]
0x400500 | 0x3037207964343372
0x400508 | 0x003f367562336420

[Code]
main:
push rbp // 스택 프레임 저장 (rbp 최상단에 쌓음)
mov rbp, rsp // rsp 값을 rbp 에 대입
mov esi, 0xf // esi <- 0xf
mov rdi, 0x400500 // rdi <- 0x400500
call 0x400497 <write_n> // 0x400497 에 위치한 <write_n> 함수 호출
mov eax, 0x0 // eax <- 0x0
pop rbp // 스택 프레임 최상단 값을 꺼내 rbp에 대입 = 기존 복귀
ret // 반환

write_n:
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-0x8], rdi // rdi(=0x400500)를 [rbp-0x8]가 가리키는 곳에 8바이트만큼 대입 = [rsp-0x8]
mov DWORD PTR [rbp-0xc], esi // esi(=0xf)를 [rbp-0xc]가 가리키는 곳에 4바이트만큼 대입 = [rsp-0xc]
xor rdx, rdx // 같은 값 xor 연산 -> rdx=0 으로 초기화
mov edx, DWORD PTR [rbp-0xc] // [rbp-0xc]가 가리키는 값(0xf)을 edx에 대입 (edx는 rdx의 하위 32비트, rdx=0xf=edx)
mov rsi, QWORD PTR [rbp-0x8] // rbp-0x8이 가리키는 값(0x400500)을 rsi에 대입
mov rdi, 0x1 // rdi <- 0x1
mov rax, 0x1 // rax <- 0x1
syscall // rax = 0x1 -> write 시스템 콜 호출
pop rbp
ret

write(0x1, 0x400500, 0xf) -> 0x400500부터 15byte만큼 출력
0x30372079643433372 출력

72 33 34 64 79 20 37 30 20 64 33 62 75 36 3f 00

-> r34dy 70 d3bu6?

역순인 이유
x86-64 아키텍처 : 리틀 엔디안 방식 (little-endian) 사용
최하위 비트(LSB)부터 부호화되어 저장됩니다

0개의 댓글