2023. 1. 15. 01:30ㆍ해킹
일단 orw를 짜는 법들을 알아보자.
char buf[0x30];
int fd = open("/tmp/flag", RD_ONLY, NULL);
read(fd, buf, 0x30);
write(1, buf, 0x30);
파일을 다뤄야하니 일단 리눅스 파일시스템부터 알아본다.
파일 시스템은 크게 네가지로 부트블록, 슈퍼블록, 아이노드 블록, 데이터 블록가 있다.
1. 부트블록 : 운영체제를 부팅시키기 위해 픨요한 코드.
2. 슈퍼블록 : 파일 시스템과 관련된 정보를 저장. ex)파일 시스템의 크기, 아이노드블록이나 데이터블록의 전체 크기 등
3. 아이노드블록 : 파일에 대한 정보를 저장하고 있는 부분. ex) 파일의 접근권한, 소유자, 크기, 시간 , 데이터 블록의 포인터
4. 데이터 블록 : 파일에 실제 보관해야하는 데이터들을 저장.
이런 파일을 다루는 프로그램을 작성할 때는 파일기술자를 알아야한다.
file을 open하면 fd라는 파일 기술자 번호가 할당된다.
이때 0 1 2를 제외하고 나머지 남는 공간의 번호가 할당된다.(0, 1, 2가 kill 된 상태가 아닌 이상)
이제 fd가 가리키는 file table에서 mode나 offset등의 정보가 저장되어있고 이 offset이 아이노드 테이블을 가리킨다.
여기서 우리는 system call을 할 때 필요한 레지스터를 알아야한다.
rax : system call number
arg1 : rdi
arg 2 : rsi
arg 3 : rdx
먼저 open하려는 file의 정보를 stack에 push한다
/tmp/file > 2f,74,6d,70,2f,66,69,6c,65
64비트(8바이트) 환경이므로 아스키코드 1개(16진수 2개) = 1바이트 = max 8개의 아스키 코드까지 들어감
즉 /tmp/fil , e를 나눠서 push해야한다.
push 0x65
push 0x6c69662f706d742f
로 나눠서 push한다.
mov rdi rsp(rsp를 mov가 가리키게 끔)
xor rsi rsi (rsi 0으로 초기화, read_only mode)
xor rdx rdx(rdx 0으로 초기화, mode X)
mov rax 0x02(system call number open 2)
여기서 0x02를 rax에 저장한 이유는 linux systemcall table 때문이다.
https://rninche01.tistory.com/entry/Linux-system-call-table-%EC%A0%95%EB%A6%ACx86-x64
Linux system call table 정리(32bit, 64bit)
어셈블리어로 쉘 코드를 작성할 때 종종 system call table을 찾아보는 일이 있어서 간략하게 정리하도록 하였다. system call 이란? 운영체제에서 커널 모드와 유저 모드로 나뉘게 되는데 유저 단에서
rninche01.tistory.com
syscall
하면 시스템 콜이 시행된다.
이제 read
여기서 반환된 값은 이전 글에서 rax에 저장된다고 했으니 rax에 fd가 들어있을 것이다.
mov rdi rax (fd 옮기기)
mov rsi rsp (rsi에 가장 위 스택 가리키게 끔 함)
sub rsi 0x30(rsi에 rsp보다 0x30만큼 높이 가게끔 함, buf 역할)
mov rdx 0x30 (size 0x30)
mov rax 0x0 (system call 0번, read)
syscall
write해보자.
mov rdi, 1 (출력은 표준입출력을 할 것이므로 1에 출력, 만약 파일에 하고 싶다면 쓸 파일 필요)
mov rax, 0x1 ; (system call write)
syscall
이것을 shellcode로 바꿔보자.
; File name: shellcode.asm
section .text
global _start
_start:
push 0x65
push 0x6c69662f706d742f
mov rdi rsp
xor rsi rsi
xor rdx rdx
mov rax 0x02
mov rdi rax
mov rsi rsp
sub rsi 0x30
mov rdx 0x30
mov rax 0x0
syscall
mov rdi, 1
mov rax, 0x1 ;
syscall
sudo apt-get install nasm
nasm -f elf64 shellcode.asm
objcopy --dump-section .text=shellcode.bin shellcode.o
xxd shellcode.bin 으로 shellcode를 볼 수 있다.
'해킹' 카테고리의 다른 글
kali linux를 이용한 스캔 실습 (0) | 2023.01.15 |
---|---|
[dreamhack]basic_exploitation_000 풀이 (0) | 2023.01.10 |
shellcode 공유 사이트 (0) | 2023.01.09 |