From: Daniel Liu Date: Sat, 19 Jun 2021 20:16:14 +0000 (-0400) Subject: lots more commands X-Git-Url: https://git.danieliu.xyz/?a=commitdiff_plain;h=2505d1841221648a72e768f23a5a475c8e1c01d1;p=sped.git lots more commands --- diff --git a/fileutils.asm b/fileutils.asm index 0f829f5..ad284b5 100644 --- a/fileutils.asm +++ b/fileutils.asm @@ -80,10 +80,14 @@ readFile: mov DWORD [ebp-BUF_PTR], eax ; write string to buffer - mov eax, DWORD [ebp-BUF_PTR] + mov eax, [ebp-LINES_READ] mov ecx, 4 mul ecx - mov eax, esi + add eax, DWORD [ebp-BUF_PTR] + mov [eax], esi + + ; push DWORD [eax] + ; call printf add DWORD [ebp-LINES_READ], 1 diff --git a/sped.asm b/sped.asm index 1e20038..585697b 100644 --- a/sped.asm +++ b/sped.asm @@ -20,9 +20,13 @@ extern stdout 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 - invalidcommand_str db `invalid command\n`, 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 @@ -55,9 +59,13 @@ main: call readFile mov [buffer], eax - mov [buffer_lines], ebx + mov [buffer_lines], ecx mov DWORD [cur_line], 0x00 + push DWORD [buffer_lines] + push readlines_str + call printf + call repl mov eax, 0 @@ -98,7 +106,7 @@ repl: ; commands are single char for now cmp ecx, 1 - jne _repl_invalid + jne _repl_invalid_cmd ; parse commands mov eax, DWORD [ebp-CMDSTR] @@ -111,10 +119,78 @@ repl: 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: + + + jmp _repl_invalid_cmd + + ; some error messages + _repl_invalid_cmd: + push invalidcmd_str + call printf + jmp _repl_continue - _repl_invalid: - push invalidcommand_str + _repl_invalid_addr: + push invalidaddr_str call printf + jmp _repl_continue _repl_continue: jmp _repl_loop