【发布时间】:2019-10-04 12:46:53
【问题描述】:
第一件事:
format ELF
section '.text' executable
public _start
_start:
; OPENNIN FILE DESCRIPTOR FOR A PATH -->
mov ebx, logfile
mov eax, 5
mov ecx, 64
mov edx, 777o
int 0x80
; JUNT `STRLEN` -->
mov edi, ebx
mov ebx, eax
xor ecx, ecx
not ecx
xor eax, eax
cld
repne scasb
not ecx
; WRITTING INTO THE FD'S FILE -->
mov edx, ecx
sub edi, edx
mov ecx, edi
lea edx, [edx]
mov eax, 4
int 0x80
; CLOSE DESCRIPTOR -->
mov eax, 6
int 0x80
; EXIT -->
mov eax, 1
xor ebx, ebx
int 0x80
section '.data' writeable
logfile db "#!@#$%$:",0
以上是我写到fasm的代码。
在编译运行这段代码的时候(这部分做的不错,就不赘述了),遇到->的情况
我的文件已创建(当然命名为 #!@#$%$:...),但没有写入任何内容。
我无法理解为什么没有写入新文件的原因! 寄存器状态应该是这样的,如下所述: https://syscalls.kernelgrok.com/ 并且文件关闭得很好。
发生这种情况的原因是什么?
【问题讨论】:
-
您的代码没有错误检查。另外,学习使用调试器和系统调用跟踪器。无论如何,问题是您以只读方式打开文件。将
mov ecx, 64更改为mov ecx, 65. -
它没有错误检查,因为我不需要那些......我只想使用系统调用。我使用 gdb 对其进行了调试,但如您所知 - 它没有显示函数中给出的数字的名称。在您推荐之后,我尝试了 strace ,它确实向我显示了与该数字等效的文本。那谢谢啦。我不知道那里可能。 @小丑
-
@ervervevevev 如果不检查错误,就不会注意到发生了什么错误。
-
使用
strace进行错误检查对于在 asm 或 C 中使用系统调用的实验来说是正常的。比实际编写错误处理要容易得多,尤其是在 asm 中。但是如果你不知道 strace 的存在,那么你应该在使用 GDB 之后一直在其中一个 errno 头文件中查找 EAX/RAX 返回值。