완료됨
push '상수'일 때 크기 제한, rdi가 "/tmp/flag/"를 읽는 방법?

아래 코드

push 0x67
mov rax, 0x616c662f706d742f

이렇게 되어 있을 때 그냥 push로 0x616c662f706d742f 값을 스택에 저장하는 방법이 되지 않을까 생각해서 해보았는데
오퍼랜드 형식에 맞지 않다고 에러가 발생하고 위의 값을 4byte크기로 push 했는데 그때는 스택에 저장이 되었습니다.
64bit os 64bit 아키텍처인데 왜 8byte 상수를 push를 통해 스택에 저장하지 못할까 궁금합니다!


mov rdi, rsp

"/tmp/flag"는 총 9byte인데 rdi가 rsp와 같은 영역을 가르킬 때 rdi 딱 9byte까지만 읽는 이유가 뭘까요? 8byte씩 읽는게 아닌가요?

도움 말씀 부탁 드리겠습니다.

#시스템_해킹 #공격기법
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
avatar
믕믕이부하
대표 업적 없음

push를 이용하여 8바이트 값을 넣지 못하는 이유는 해당 명령어를 아예 지원하지 않기 때문입니다.

또 rdi는 8바이트 값만 저장할 수 있습니다. 그렇기 때문에 rdi가 가리키는 값은 /tmp/flag 문자열이 아니라 해당 문자열 값이 존재하는 메모리 주소를 가리키고 어떤 함수가 rdi 값을 참조해 문자열을 읽을때는 0x00(Null) 값이 나올때까지 읽습니다. /tmp/flag 문자열 앞에 Null 바이트가 있다면 9바이트까지만 읽는 것이고 아니라면 그 앞에 있는 값까지 계속 읽게되겠죠.

2022.01.13. 05:41