Compare commits
2 Commits
d4cbc9082a
...
a625961e75
| Author | SHA1 | Date | |
|---|---|---|---|
| a625961e75 | |||
| fd0ed723aa |
+139
-11
@@ -4,24 +4,50 @@
|
|||||||
|
|
||||||
%define SYS_READ 0
|
%define SYS_READ 0
|
||||||
%define SYS_WRITE 1
|
%define SYS_WRITE 1
|
||||||
|
%define SYS_OPEN 2
|
||||||
|
%define SYS_LSEEK 8
|
||||||
|
%define SYS_MMAP 9
|
||||||
%define SYS_IOCTL 16
|
%define SYS_IOCTL 16
|
||||||
|
%define SYS_MREMAP 25
|
||||||
%define SYS_EXIT 60
|
%define SYS_EXIT 60
|
||||||
|
|
||||||
%define TCGETS 0x5401
|
%define TCGETS 0x5401
|
||||||
%define TCSETS 0x5402
|
%define TCSETS 0x5402
|
||||||
|
|
||||||
|
%define CTRL_S 0x13
|
||||||
|
%define CTRL_X 0x18
|
||||||
|
|
||||||
|
%define O_RDWR 2
|
||||||
|
%define O_CREAT 0x40
|
||||||
|
|
||||||
|
%define SEEK_END 2
|
||||||
|
|
||||||
|
%DEFINE FREAD_BUF 4096
|
||||||
|
|
||||||
section .data
|
section .data
|
||||||
ioctl_err_m db "ioctl error", 10, 0
|
ioctl_err_m db "ioctl error", 10, 0
|
||||||
|
args_err_m db "args error", 10, 0
|
||||||
|
fopen_err_m db "file open error", 10, 0
|
||||||
|
|
||||||
section .bss
|
section .bss
|
||||||
orig_termios resb 60
|
orig_termios resb 60
|
||||||
raw_termios resb 60
|
raw_termios resb 60
|
||||||
cbuf resb 4
|
cbuf resb 4
|
||||||
|
rbuf resb FREAD_BUF
|
||||||
|
|
||||||
|
fd resd 1 ; файловый дескриптор
|
||||||
|
size resq 1 ; размер исходного файла
|
||||||
|
cur_size resq 1 ; текущий размер файла
|
||||||
|
bsize resq 1 ; размер выделяемой области
|
||||||
|
pos resq 1 ; позиция в файле
|
||||||
|
|
||||||
|
buf resq 1 ; указатель на выделяемую память
|
||||||
|
|
||||||
section .text
|
section .text
|
||||||
global _start
|
global _start
|
||||||
|
|
||||||
_start:
|
_start:
|
||||||
|
; сохраняем изначальное состояние терминала
|
||||||
mov rax, SYS_IOCTL
|
mov rax, SYS_IOCTL
|
||||||
mov rdi, STDIN
|
mov rdi, STDIN
|
||||||
mov rsi, TCGETS
|
mov rsi, TCGETS
|
||||||
@@ -36,16 +62,85 @@ _start:
|
|||||||
mov rdi, raw_termios
|
mov rdi, raw_termios
|
||||||
rep movsd
|
rep movsd
|
||||||
|
|
||||||
|
; неебические костыли
|
||||||
|
mov eax, [raw_termios + 0]
|
||||||
|
and eax, ~0x400 ; IXON
|
||||||
|
mov [raw_termios + 0], eax
|
||||||
|
|
||||||
mov eax, [raw_termios + 12]
|
mov eax, [raw_termios + 12]
|
||||||
and eax, ~(2 | 8 | 1)
|
and eax, ~(2 | 8 | 1) ; ICANON | ECHO | ISIG
|
||||||
mov [raw_termios + 12], eax
|
mov [raw_termios + 12], eax
|
||||||
|
|
||||||
|
; переходим в raw mode
|
||||||
mov rax, SYS_IOCTL
|
mov rax, SYS_IOCTL
|
||||||
mov rdi, STDIN
|
mov rdi, STDIN
|
||||||
mov rsi, TCSETS
|
mov rsi, TCSETS
|
||||||
mov rdx, raw_termios
|
mov rdx, raw_termios
|
||||||
syscall
|
syscall
|
||||||
|
|
||||||
|
; ищем название файла в аргументах
|
||||||
|
mov rbx, [rsp]
|
||||||
|
cmp rbx, 2
|
||||||
|
jne args_err
|
||||||
|
|
||||||
|
mov rax, SYS_OPEN
|
||||||
|
mov rdi, [rsp + 16]
|
||||||
|
mov rsi, O_RDWR | O_CREAT
|
||||||
|
mov rdx, 0q0700
|
||||||
|
syscall
|
||||||
|
|
||||||
|
test rax, rax
|
||||||
|
js fopen_err
|
||||||
|
mov qword [rel fd], rax ; в идеале кншн файловый дескриптор сделать 32 битным но эээ лень
|
||||||
|
|
||||||
|
mov rax, SYS_LSEEK
|
||||||
|
mov rdi, qword [rel fd]
|
||||||
|
mov rsi, 0
|
||||||
|
mov rdx, SEEK_END ; меня так прикалывает тот факт, что этот код будут читать ток под пивом (и то если будут)
|
||||||
|
syscall ; а еще просто прекрасно кодить это под pastel ghost
|
||||||
|
|
||||||
|
mov qword [rel bsize], rax
|
||||||
|
shl qword [rel bsize], 1
|
||||||
|
mov qword [rel size], rax
|
||||||
|
mov qword [rel pos], rax
|
||||||
|
cmp rax, 0
|
||||||
|
je .read_loop
|
||||||
|
|
||||||
|
mov rax, SYS_LSEEK
|
||||||
|
mov rdi, qword [rel fd]
|
||||||
|
mov rsi, 0
|
||||||
|
mov rdx, 0
|
||||||
|
syscall
|
||||||
|
|
||||||
|
mov rax, SYS_MMAP
|
||||||
|
xor rdi, rdi
|
||||||
|
mov rsi, qword [rel bsize]
|
||||||
|
mov rdx, 0x3 ; PROT_READ|PROT_WRITE
|
||||||
|
mov r10, 0x22 ; MAP_PRIVATE | MAP_ANONYMOUS
|
||||||
|
mov r8, -1
|
||||||
|
mov r9, 0
|
||||||
|
syscall
|
||||||
|
mov [buf], rax
|
||||||
|
|
||||||
|
.fread_loop: ; спиздил с rd но кому не похуй
|
||||||
|
mov rax, SYS_READ
|
||||||
|
mov rdi, qword [fd]
|
||||||
|
mov rsi, rbuf
|
||||||
|
mov rdx, FREAD_BUF
|
||||||
|
syscall
|
||||||
|
|
||||||
|
test rax, rax
|
||||||
|
jz .read_loop
|
||||||
|
|
||||||
|
mov r8, rax
|
||||||
|
mov rdx, r8
|
||||||
|
mov rax, SYS_WRITE
|
||||||
|
mov rsi, rbuf
|
||||||
|
mov rdi, [buf]
|
||||||
|
syscall
|
||||||
|
|
||||||
|
jmp .fread_loop
|
||||||
|
.read_loop:
|
||||||
mov rax, SYS_READ
|
mov rax, SYS_READ
|
||||||
mov rdi, STDIN
|
mov rdi, STDIN
|
||||||
mov rsi, cbuf
|
mov rsi, cbuf
|
||||||
@@ -58,30 +153,63 @@ _start:
|
|||||||
mov rsi, cbuf
|
mov rsi, cbuf
|
||||||
syscall
|
syscall
|
||||||
|
|
||||||
mov rax, SYS_IOCTL
|
cmp byte [rel cbuf], CTRL_X
|
||||||
mov rdi, STDIN
|
je .done
|
||||||
mov rsi, TCSETS
|
|
||||||
mov rdx, orig_termios
|
|
||||||
syscall
|
|
||||||
|
|
||||||
|
cmp byte [rel cbuf], CTRL_S
|
||||||
|
je .save
|
||||||
|
|
||||||
|
jmp .read_loop
|
||||||
|
.save:
|
||||||
|
|
||||||
|
.done:
|
||||||
jmp exit
|
jmp exit
|
||||||
|
|
||||||
ioctl_err:
|
args_err:
|
||||||
args_err:
|
|
||||||
mov rax, SYS_WRITE
|
mov rax, SYS_WRITE
|
||||||
mov rdi, STDERR
|
mov rdi, STDERR
|
||||||
mov rsi, ioctl_err_m
|
mov rsi, args_err_m
|
||||||
mov edx, 12
|
mov edx, 12
|
||||||
syscall
|
syscall
|
||||||
|
|
||||||
jmp exit_err
|
jmp exit_err
|
||||||
|
|
||||||
exit_err:
|
fopen_err:
|
||||||
|
mov rax, SYS_WRITE
|
||||||
|
mov rdi, STDERR
|
||||||
|
mov rsi, fopen_err_m
|
||||||
|
mov edx, 17
|
||||||
|
syscall
|
||||||
|
|
||||||
|
jmp exit_err
|
||||||
|
|
||||||
|
ioctl_err:
|
||||||
|
mov rax, SYS_WRITE
|
||||||
|
mov rdi, STDERR
|
||||||
|
mov rsi, ioctl_err_m
|
||||||
|
mov edx, 13
|
||||||
|
syscall
|
||||||
|
|
||||||
|
jmp exit_err
|
||||||
|
|
||||||
|
exit_err:
|
||||||
|
mov rax, SYS_IOCTL
|
||||||
|
mov rdi, STDIN
|
||||||
|
mov rsi, TCSETS
|
||||||
|
mov rdx, orig_termios
|
||||||
|
syscall
|
||||||
|
|
||||||
mov rax, SYS_EXIT
|
mov rax, SYS_EXIT
|
||||||
mov rdi, 1
|
mov rdi, 1
|
||||||
syscall
|
syscall
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
|
mov rax, SYS_IOCTL
|
||||||
|
mov rdi, STDIN
|
||||||
|
mov rsi, TCSETS
|
||||||
|
mov rdx, orig_termios
|
||||||
|
syscall
|
||||||
|
|
||||||
mov rax, SYS_EXIT
|
mov rax, SYS_EXIT
|
||||||
mov rdi, 0
|
mov rdi, 0
|
||||||
syscall
|
syscall
|
||||||
Reference in New Issue
Block a user