파일 경로를 리틀엔디안으로 8바이트씩 끊어서 push 하는 것 대신 .data 섹션을 이용하는 방법은 없을까요?
이미 저장된 문자열을 이용하고싶다는 말씀으신가요?
음... 가능하긴 할 것 같습니다만,
결국은 .data 영역에 해당 파일 명이나 path를 저장해야하는데 이 문제에서는 이 또한 바이너리로 값을 넣어줘야되지 않을까요?
; File name: ex.asm
section .data
path db "/home/shell_basic/flag_name_is_loooooong", 0
section .text
global _start
_start:
mov rdi, path ; file name
xor rsi, rsi ; null
xor rdx, rdx ; null
mov rax, 2 ; syscall number (open)
syscall ; open
mov rdi, rax ; fd
sub rsp, 0x50 ; create buf
mov rsi, rsp ; buf
mov rdx, 0x50 ; count
xor rax, rax ; syscall number (read)
syscall ; read
mov rdi , 0x01 ; fd
mov rax, 0x01 ; syscall number (write)
syscall
이렇게 작성해보았는데, 뭐가 문제인지 알 수 있을까요..??
section .data
path db “/home/shell_basic/flag_name_is_loooooong”, 0
이걸 전달하면 이건 어디 들어가있을지 생각하시면 될 것 같은데요?
제 생각에는 결국 서버에서 실행중인 바이너리의 스택에 있을 것 같네요.
작성하신 어셈 코드는 텍스트 영역을 만들고 거기 스트링을 담아놨다가 mov rdi path 시 path의 주소를 가져오겠지만, 서버에서 path의 주소를 못찾지 않을까요?