혜랑's STORY

[System Hacking STAGE 2] Quiz: x86 Assembly 2 본문

무지성 공부방/Dreamhack SystemHacking

[System Hacking STAGE 2] Quiz: x86 Assembly 2

hyerang0125 2022. 1. 21. 13:25

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

return address로 반환한다.

write_n

push rbp
mov rbp, rsp

스택에 rbp를 넣고 rsp의 값을 rbp에 대입한다.

mov QWORD PTR [rbp-0x8], rdi

rdi의 값을 [rbp-0x8]의 데이터를 8바이트만큼 참조한 곳에 대입한다.

mov DWORD PTR [rbp-0xc], esi

esi의 값을 [rbp-0xc]의 데이터를 4바이트만큼 참조한 곳에 대입한다.

xor rdx, rdx

rdx와 rdx를 xor 연산한다. (아마 0으로 초기화 하는 것 같음)

mov rdx, DWORD PTR [rbp-0xc]

[rbp-0xc]의 데이터를 4바이트만큼 참조하여 rdx에 대입한다.

mov rsi, QWORD PTR [rbp-0x8]

[rbp-0x8]의 데이터를 8바이트만큼 참조하여 rsi에 대입한다.

mov rdi, 0x1

rdi에 0x1 값을 대입한다.

mov rax, 0x1

rax에 0x1 값을 대입한다.

syscall

syscall의 경우 rax로 무슨 요청인지 나타내고, rdi->rsi->rdx->rcx->r8->r9->stack의 순서대로 필요한 인자를 전달한다. 이때 앞에서 rax에 0x1 값을 넣었으므로 x64 syscall 테이블을 참고하여 write 함수가 실행된다는 것을 알 수 있다. write 함수의 인자로 (rsi, rsi, rdx)가 들어가게 된다.

pop rbp
ret

스택 최상위 값을 꺼내서 rbp에 대입하고 return address로 반환한다.

결과