완료됨
레지스터에는 특정 상수를 바로 저장하지 못하나요?
;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' 문자열이 저장된 주소만 가리키게만 할 수 있다면 어떻게 하든지 상관없습니다.

2021.08.07. 10:20