From: Daniel Liu Date: Sun, 20 Jun 2021 00:14:00 +0000 (-0400) Subject: abstracting X-Git-Url: https://git.danieliu.xyz/?p=sped.git;a=commitdiff_plain;h=89732d399de9007aaf2894b0c637e8cfb9ed47ac abstracting --- diff --git a/README.md b/README.md index 4ea05df..2436d48 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,10 @@ to build the project **c** - change the contents of the current line +**w** - saves file + +**q** - exists the program + ### FAQ **are you insane** diff --git a/fileutils.asm b/fileutils.asm index b9b41e7..1d78439 100644 --- a/fileutils.asm +++ b/fileutils.asm @@ -1,5 +1,5 @@ -; %include "utils.S" +%include "utils.S" extern printf extern malloc diff --git a/makefile b/makefile index 82074cf..18c299f 100644 --- a/makefile +++ b/makefile @@ -10,7 +10,7 @@ make: sped %.o: %.asm $(ASM) $(ASMFLAGS) -o $@ $^ -sped: sped.o fileutils.o +sped: sped.o fileutils.o repl.o $(CC) $(CFLAGS) -o $@ $^ clean: diff --git a/repl.S b/repl.S new file mode 100644 index 0000000..18805a6 --- /dev/null +++ b/repl.S @@ -0,0 +1,7 @@ + +%ifndef __REPL_S__ +%define __REPL_S__ + +extern repl + +%endif diff --git a/repl.asm b/repl.asm new file mode 100644 index 0000000..3c7f429 --- /dev/null +++ b/repl.asm @@ -0,0 +1,240 @@ + +%include "fileutils.S" + +extern printf +extern fflush +extern stdout +extern free + +global repl + +section .data + prompt_str db `sped > `, 0x00 + invalidcmd_str db `invalid command\n`, 0x00 + invalidaddr_str db `invalid address\n`, 0x00 + charcount_str db `read %i chars\n`, 0x00 + currentline_str db `current line: %i\n`, 0x00 + echo_str db `%s`, 0x00 ; print strings without format exploit + +section .bss + buffer resb 4 + buffer_lines resb 4 + buffer_filename resb 4 + cur_line resb 4 + +section .text + +; prompt for user +; args: buffer, buffer_lines, buffer_filename +repl: + + %define _BUFFER 16 + %define _BUFFER_LINES 12 + %define _BUFFER_FILENAME 8 + %define CMDSTR 4 ; the previous line read from user + + push ebp + mov ebp, esp + + sub esp, 4 + + ; set bss vars + mov eax, [ebp+_BUFFER] + mov [buffer], eax + mov eax, [ebp+_BUFFER_LINES] + mov [buffer_lines], eax + mov eax, [ebp+_BUFFER_FILENAME] + mov [buffer_filename], eax + mov DWORD [cur_line], 0x00 + + _repl_loop: + + ; print the prompt + push prompt_str + call printf + push DWORD [stdout] + call fflush + + ; read line from stdin + push 0 + call readLine + + mov DWORD [ebp-CMDSTR], eax + + ; commands are single char for now + cmp ecx, 1 + jne _repl_invalid_cmd + + ; parse commands + mov eax, DWORD [ebp-CMDSTR] + mov eax, [eax] + + ; q exists program =-=-=-=-=-=-=-=-=-=-=-=-= + mov eax, DWORD [ebp-CMDSTR] + cmp BYTE [eax], 'q' + jne _repl_cmd_quit_end + jmp _repl_exit + _repl_cmd_quit_end: + + ; p prints current line =-=-=-=-=-=-=-=-=-=-= + mov eax, DWORD [ebp-CMDSTR] + cmp BYTE [eax], 'p' + jne _repl_cmd_print_end + + mov eax, DWORD [cur_line] + mov ecx, 4 + mul ecx + add eax, [buffer] + push DWORD [eax] + push echo_str + call printf + jmp _repl_continue + _repl_cmd_print_end: + + ; n prints the current line number =-=-=-=-=-=-=-= + mov eax, DWORD [ebp-CMDSTR] + cmp BYTE [eax], 'n' + jne _repl_cmd_number_end + + push DWORD [cur_line] + push currentline_str + call printf + + jmp _repl_continue + _repl_cmd_number_end: + + ; - goes to prev line =-=-=-=-=-=-=-=-=-=-=-=-= + mov eax, DWORD [ebp-CMDSTR] + cmp BYTE [eax], '-' + jne _repl_cmd_decline_end + + ; make sure we are within bounds + mov eax, DWORD [cur_line] + sub eax, 1 + cmp eax, 0 + jl _repl_invalid_addr + + sub DWORD [cur_line], 1 + + jmp _repl_continue + _repl_cmd_decline_end: + + ; + goes to next line =-=-=-=-=-=-=-=-=-=-=-=-= + mov eax, DWORD [ebp-CMDSTR] + cmp BYTE [eax], '+' + jne _repl_cmd_incline_end + + ; make sure we are within bounds + mov eax, DWORD [cur_line] + add eax, 1 + cmp eax, [buffer_lines] + jge _repl_invalid_addr + + add DWORD [cur_line], 1 + + jmp _repl_continue + _repl_cmd_incline_end: + + ; g goes to first line =-=-=-=-=-=-=-=-=-=-=-=-= + mov eax, DWORD [ebp-CMDSTR] + cmp BYTE [eax], 'g' + jne _repl_cmd_jumptop_end + + mov DWORD [cur_line], 0x00 + + jmp _repl_continue + _repl_cmd_jumptop_end: + + ; G goes to last line =-=-=-=-=-=-=-=-=-=-=-=-= + mov eax, DWORD [ebp-CMDSTR] + cmp BYTE [eax], 'G' + jne _repl_cmd_jumpbot_end + + mov eax, DWORD [buffer_lines] + sub eax, 1 + mov DWORD [cur_line], eax + + jmp _repl_continue + _repl_cmd_jumpbot_end: + + ; c changes the current line =-=-=-=-=-=-=-=-=-= + mov eax, DWORD [ebp-CMDSTR] + cmp BYTE [eax], 'c' + jne _repl_cmd_change_end + + ; read a new line to use + push 0 + call readLine + + mov esi, eax + + ; free old string + mov eax, [cur_line] + mov ecx, 4 + mul ecx + add eax, [buffer] + push DWORD [eax] + call free + + ; insert new string + mov eax, [cur_line] + mov ecx, 4 + mul ecx + add eax, DWORD [buffer] + mov [eax], esi + + jmp _repl_continue + _repl_cmd_change_end: + + ; d delete line =-=-=-=-=-=-=-=-=-=-=-=-= + mov eax, DWORD [ebp-CMDSTR] + cmp BYTE [eax], 'd' + jne _repl_cmd_delete_end + + + + jmp _repl_continue + _repl_cmd_delete_end: + + ; w writes file =-=-=-=-=-=-=-=-=-=-=-=-= + mov eax, DWORD [ebp-CMDSTR] + cmp BYTE [eax], 'w' + jne _repl_cmd_write_end + + push DWORD [buffer_filename] + push DWORD [buffer] + push DWORD [buffer_lines] + call writeFile + + jmp _repl_continue + _repl_cmd_write_end: + + + ; if no commands were matched, it's an error + jmp _repl_invalid_cmd + + ; some error messages + _repl_invalid_cmd: + push invalidcmd_str + call printf + jmp _repl_continue + + _repl_invalid_addr: + push invalidaddr_str + call printf + jmp _repl_continue + + _repl_continue: + jmp _repl_loop + + _repl_exit: + + %undef _BUFFER + %undef _BUFFER_LINES + %undef _BUFFER_FILENAME + %undef CMDSTR + + mov esp, ebp + pop ebp + ret + diff --git a/sped.asm b/sped.asm index 213f3ea..a14dbd4 100644 --- a/sped.asm +++ b/sped.asm @@ -2,11 +2,9 @@ ; written by pinosaur %include "fileutils.S" +%include "repl.S" extern printf -extern fflush -extern stdout -extern free global main @@ -23,27 +21,21 @@ section .data banner_str db `SPED - the stupidly pointless editor\n`, 0x00 nofile_str db `no file provided\n`, 0x00 readlines_str db `opened file with %i lines\n`, 0x00 - prompt_str db `sped > `, 0x00 - invalidcmd_str db `invalid command\n`, 0x00 - invalidaddr_str db `invalid address\n`, 0x00 - charcount_str db `read %i chars\n`, 0x00 - currentline_str db `current line: %i\n`, 0x00 - echo_str db `%s`, 0x00 ; print strings without format exploit - -section .bss - buffer resb 4 - buffer_lines resb 4 - buffer_filename resb 4 - cur_line resb 4 section .text main: %define _ARGC 8 %define _ARGV 12 + %define BUFFER 4 + %define BUFFER_LINES 8 + %define BUFFER_FILENAME 12 + push ebp mov ebp, esp + sub esp, 12 + ; read command line args mov ecx, [ebp+_ARGC] cmp ecx, 1 @@ -59,19 +51,21 @@ main: mov ebx, DWORD [ebp+_ARGV] add ebx, 4 ; first user arg is filename mov ebx, [ebx] - mov [buffer_filename], ebx + mov [ebp-BUFFER_FILENAME], ebx - push DWORD [buffer_filename] + push DWORD [ebp-BUFFER_FILENAME] call readFile - mov [buffer], eax - mov [buffer_lines], ecx - mov DWORD [cur_line], 0x00 + mov [ebp-BUFFER], eax + mov [ebp-BUFFER_LINES], ecx - push DWORD [buffer_lines] + push DWORD [ebp-BUFFER_LINES] push readlines_str call printf + push DWORD [ebp-BUFFER] + push DWORD [ebp-BUFFER_LINES] + push DWORD [ebp-BUFFER_FILENAME] call repl mov eax, 0 @@ -81,199 +75,13 @@ main: ; free string array - %undef _ARGC %undef _ARGV + %undef BUFFER + %undef BUFFER_LINES + %undef BUFFER_FILENAME mov esp, ebp pop ebp ret -; prompt for user -; no args - reads from globals -repl: - - %define CMDSTR 4 ; the previous line read from user - - push ebp - mov ebp, esp - - sub esp, 4 - - _repl_loop: - - ; print the prompt - push prompt_str - call printf - push DWORD [stdout] - call fflush - - ; read line from stdin - push 0 - call readLine - - mov DWORD [ebp-CMDSTR], eax - - ; commands are single char for now - cmp ecx, 1 - jne _repl_invalid_cmd - - ; parse commands - mov eax, DWORD [ebp-CMDSTR] - mov eax, [eax] - - ; q exists program =-=-=-=-=-=-=-=-=-=-=-=-= - mov eax, DWORD [ebp-CMDSTR] - cmp BYTE [eax], 'q' - jne _repl_cmd_quit_end - jmp _repl_exit - _repl_cmd_quit_end: - - ; p prints current line =-=-=-=-=-=-=-=-=-=-= - mov eax, DWORD [ebp-CMDSTR] - cmp BYTE [eax], 'p' - jne _repl_cmd_print_end - - mov eax, DWORD [cur_line] - mov ecx, 4 - mul ecx - add eax, [buffer] - push DWORD [eax] - push echo_str - call printf - jmp _repl_continue - _repl_cmd_print_end: - - ; n prints the current line number =-=-=-=-=-=-=-= - mov eax, DWORD [ebp-CMDSTR] - cmp BYTE [eax], 'n' - jne _repl_cmd_number_end - - push DWORD [cur_line] - push currentline_str - call printf - - jmp _repl_continue - _repl_cmd_number_end: - - ; - goes to prev line =-=-=-=-=-=-=-=-=-=-=-=-= - mov eax, DWORD [ebp-CMDSTR] - cmp BYTE [eax], '-' - jne _repl_cmd_decline_end - - ; make sure we are within bounds - mov eax, DWORD [cur_line] - sub eax, 1 - cmp eax, 0 - jl _repl_invalid_addr - - sub DWORD [cur_line], 1 - - jmp _repl_continue - _repl_cmd_decline_end: - - ; + goes to next line =-=-=-=-=-=-=-=-=-=-=-=-= - mov eax, DWORD [ebp-CMDSTR] - cmp BYTE [eax], '+' - jne _repl_cmd_incline_end - - ; make sure we are within bounds - mov eax, DWORD [cur_line] - add eax, 1 - cmp eax, [buffer_lines] - jge _repl_invalid_addr - - add DWORD [cur_line], 1 - - jmp _repl_continue - _repl_cmd_incline_end: - - ; g goes to first line =-=-=-=-=-=-=-=-=-=-=-=-= - mov eax, DWORD [ebp-CMDSTR] - cmp BYTE [eax], 'g' - jne _repl_cmd_jumptop_end - - mov DWORD [cur_line], 0x00 - - jmp _repl_continue - _repl_cmd_jumptop_end: - - ; G goes to last line =-=-=-=-=-=-=-=-=-=-=-=-= - mov eax, DWORD [ebp-CMDSTR] - cmp BYTE [eax], 'G' - jne _repl_cmd_jumpbot_end - - mov eax, DWORD [buffer_lines] - sub eax, 1 - mov DWORD [cur_line], eax - - jmp _repl_continue - _repl_cmd_jumpbot_end: - - ; c changes the current line =-=-=-=-=-=-=-=-=-= - mov eax, DWORD [ebp-CMDSTR] - cmp BYTE [eax], 'c' - jne _repl_cmd_change_end - - ; read a new line to use - push 0 - call readLine - - mov esi, eax - - ; free old string - mov eax, [cur_line] - mov ecx, 4 - mul ecx - add eax, [buffer] - push DWORD [eax] - call free - - ; insert new string - mov eax, [cur_line] - mov ecx, 4 - mul ecx - add eax, DWORD [buffer] - mov [eax], esi - - jmp _repl_continue - _repl_cmd_change_end: - - ; w writes file =-=-=-=-=-=-=-=-=-=-=-=-= - mov eax, DWORD [ebp-CMDSTR] - cmp BYTE [eax], 'w' - jne _repl_cmd_write_end - - push DWORD [buffer_filename] - push DWORD [buffer] - push DWORD [buffer_lines] - call writeFile - - jmp _repl_continue - _repl_cmd_write_end: - - - jmp _repl_invalid_cmd - - ; some error messages - _repl_invalid_cmd: - push invalidcmd_str - call printf - jmp _repl_continue - - _repl_invalid_addr: - push invalidaddr_str - call printf - jmp _repl_continue - - _repl_continue: - jmp _repl_loop - - _repl_exit: - - %undef CMDSTR - - mov esp, ebp - pop ebp - ret - diff --git a/utils.S b/utils.S new file mode 100644 index 0000000..5c09a23 --- /dev/null +++ b/utils.S @@ -0,0 +1,18 @@ + +%ifndef __UTILS_S__ +%define __UTILS_S__ + +; gets the nth string ptr in a str array +; of the form: str_offset buffer, n +; result is in eax +%macro str_offset 2 + mov eax, %2 + mov ecx, 4 + mul ecx + add eax, DWORD %1 +%endmacro + +extern shiftLeft +extern shiftRight + +%endif diff --git a/utils.asm b/utils.asm new file mode 100644 index 0000000..fd8529d --- /dev/null +++ b/utils.asm @@ -0,0 +1,27 @@ + +extern memmove + +global shiftLeft +global shiftRight + +section .text + +shiftLeft: + push ebp + mov ebp, esp + + + + mov esp, ebp + pop ebp + ret + +shiftRight: + push ebp + mov ebp, esp + + + + mov esp, ebp + pop ebp + ret