완료됨
레지스터에는 특정 상수를 바로 저장하지 못하나요?
;Name: execve.S
mov rax, 0x68732f6e69622f
push rax
mov rdi, rsp ; rdi = "/bin/sh\x00"
xor rsi, rsi ; rsi = NULL
xor rdx, rdx ; rdx = NULL
mov rax, 0x3b ; rax = sys_execve
syscall ; execve("/bin/sh", null, null)
execve셸코드를 보면 0x68732f6e69622f("/bin/sh\x00")라는 값을 rdi레지스터에 넣기 위해서
mov rax, 0x68732f6e69622f 하는 것이 아니라 rax레지스터에 저장하고 rax을 스택에 푸쉬해서 rdi에 저장하는 방식인데
굳이 바로 rdi레지스터에 저장하지 않고 이런 방식으로 해야 하는 이유가 있나요?
그래서
;Name: execve_test.S
mov rdi, 0x68732f6e69622f
xor rsi, rsi ; rsi = NULL
xor rdx, rdx ; rdx = NULL
mov rax, 0x3b ; rax = sys_execve
syscall ; execve("/bin/sh", null, null)
이렇게 만들어서 디버깅 해봤더니 rdi에 0x68732f6e69622f가 들어가긴 하는데 문자열 "/bin/sh"로 인식되지 않아서 execve콜에서 아무일도 일어나지 않네요...
그럼 레지스터에는 주소값만 저장할 수 있는 건가요?
근데 rax엔 0x3b가 바로 들어가는데...
rax와 rdi의 차이인건가요?
#시스템_해킹
#공격기법
작성자 정보
답변
1
Karatus
워게임: 50
rdi가 '/bin/sh' 문자열이 저장된 주소만 가리키게만 할 수 있다면 어떻게 하든지 상관없습니다.