다음 어셈블리 코드를 실행했을 때 출력되는 결과로 올바른 것은?
[Code]
main:
push rbp
mov rbp, rsp
mov esi, 0xf
mov rdi, 0x400500
call 0x400497 <write_n>
mov eax, 0x0 // eax는 반환값. 즉, return 0
pop rbp
ret
write_n:
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-0x8],rdi //QWORD=8byte
mov DWORD PTR [rbp-0xc],esi //DWORD=4byte
xor rdx, rdx
mov edx, DWORD PTR [rbp-0xc] //DWORD=4byte
mov rsi,QWORD PTR [rbp-0x8] //QWORD=8byte
mov rdi, 0x1
mov rax, 0x1
syscall
pop rbp
ret
==================================
[Memory]
0x400500 | 0x3037207964343372
0x400508 | 0x003f367562336420
write_n 함수 내
mov rsi,QWORD PTR [rbp-0x8] 는 [rbp-0x8]부터 8byte만큼 참조하여 rsi에 복사한다. 0x400500~0x400508까지의 값이 들어가는 것임.
결국 복사되는 값은 0x3037207964343372 0x003f367562336420
syscall은 rax 값과 syscall table을 보고 어떤 함수를 콜하는지 알 수 있다. rax가 1이니 write 함수를 호출함을 확인.
syscall 시 사용되는 매개변수는 rdi, rsi, rdx, rcx, r8, r9 순서로 사용된다. write에서는 앞 3개가 사용.
rdi = 0x01 / rsi = 데이터(0x3037207964343372 0x003f367562336420) / rdx= 0
write(0x01, 0x3037207964343372 0x003f367562336420,0)
※ write 함수의 첫 번째 매개변수가 0x01인 이유: fd =1 이면 stdout으로 출력함을 나타냄.
※ rsi는 파일에 쓸 데이터의 메모리 공간에 대한 포인터. 해당 데이터들이 write된다는 것.
그럼 저 데이터를 해석하면 답이 나오겠다.
0x3037207964343372
→ 07 yd43r
0x003f367562336420
→ 0?6ub3d
이제 거꾸로 읽어보자. (Little Endian)
r34dy 70 d3bu6?
'보안 > 리버싱' 카테고리의 다른 글
reversing.kr - Easy ELF (0) | 2024.08.26 |
---|---|
x64 assembly basic (0) | 2022.07.10 |
86 Assembly: Essential Part(1) quiz (0) | 2022.07.08 |
#2 동적분석과 정적분석 (0) | 2022.07.01 |
#1 리버싱이란? (0) | 2022.07.01 |