*intel 문법의 기준으로 작성된 글입니다.
0x68732f6e69622f 라는 문자열을 rdi 레지스터에 전달하고 싶다고 하자.
보통은 mov rdi, 0x68732f6e69622f를 떠올릴것이다. 나도 직관적으로 그렇게 적곤했다. 그러나 다른 레퍼런스에서는
mov rax, 0x68732f6e69622f
push rax
mov rid, rsp
의 형태로 작성하는 것을 볼 수 있었다.
왜 한 줄로 끝낼 수 있는 것을 굳이 스택 포인터를 통해 넘겨줄까?
차이는 문자열을 직접 레지스터[rdi]에 전달하냐 아니면 주소를 통해 전달하냐이다.
결론은 주소를 통해서 전달하는 것이 훨씬 더 안정적이다.
예제인 문자열은 8바이트를 넘지 않아 데이터 전달 중에 잘려서 부분만 전달되거나 하지 않는다. 하지만 8바이트 이상의 데이터인 경우에는 직접 문자열을 전달하는 경우에는 잘려서 안정성이 떨어진다. 이를 방지하기 위해 아예 문자열의 주소를 전달하여 읽어들일 수 있도록 하기 위해 스택 포인터로 전달하는 방식을 사용하는 것이다.
'Security > System Security' 카테고리의 다른 글
| [Dreamhack] return_address_overwrite (0) | 2024.10.12 |
|---|---|
| [Dreamhack] shell_basic 문제풀이 (0) | 2024.10.12 |