https://dreamhack.io/learn/quiz/25
해당 문제를 보고 나름대로 해석해봤는데,
마지막 부분을 잘 모르겠습니다..
`push rbp
rbp 생성
mov rbp, rsp
rsp = rbp로 초기화
mov esi, 0xf
esi = 0xf
mov rdi, 0x400500
rdi = 0x400500
call 0x400497 <write_n>
write_n 함수로 이동
psuh rbp
rbp 생성
mov rbp, rsp
rsp = rbp로 초기화
mov QWORD PTR [rbp-0x8], rdi
[rbp-0x8] = 0x400500
mov DWORD PTR [rbp-0xc], esi
[rbp-0xc] = 0xf
xor rdx, rdx
rdx = 0
mov edx, DWORD PTR [rbp-0xc]
edx = [rbp-0xc] = 0xf
mov rsi, QWORD PTR [rbp-0x8]
rsi = [rbp-0x8] = 0x400500
mov rdi, 0x1
rdi = 0x1
mov rax, 0x1
rax = 0x1
syscall
-> rax = 0x1이므로 write syscall을 요청
write(rdi, rsi, rdx)
=> write(0x1, 0x400500, 0)
=> 1바이트씩 0x400500주소부터 0개 읽음(?)
`
mov edx, DWORD PTR [rbp-0xc]
edx = [rbp-0xc] = 0xf
니까 0xf개 만큼 출력해주겠는데요? ㅎㅎ
rdx와 edx는 같은 레지스터입니다.
작동 시 다루는 바이트 수만 다른거라서요.
예를들어 레지스터에
0x1122334455667788
이 있을때
push rdx는 저걸 다 넣지만
push edx는
0x88776655
의 4바이트만 넣어주는 차이입니다.
혹시 저 syscall 부분에서 왜 rax=0x1이면 write 인지, write 말고 다른 것은 있는지,write(rdi, rsi, rdx)은 write을 쓸 때 그냥 기본적인 형식인건지 궁금한데 알려주실 분 계신가요..?