【发布时间】:2020-08-03 19:39:52
【问题描述】:
我是汇编新手,正在尝试编写一个“echo”内置版本,但一次只能操作 1 个字节。
我有以下按我想要的方式工作,除了它在读取和写入时都溢出超过 1 个字节,即使我在两个系统调用中明确说 x2 中的 1 个字节。我做错了什么?
示例运行:
sh-4.2$ ./echo1b
f
f
o
o
b
b
bar
bar
bazbazbaz
bazbazbaz
q
sh-4.2$
代码如下:
.data
temp: .byte 1
.text
.globl _start
_start:
/* read one byte from stdin, store to temp */
mov x0, #0x0
adr x1, temp
mov x2, #0x1
mov x8, #0x3F
svc #0x0
/* write newline to stdout */
mov x0, #0x1
mov x1, #0xA
mov x2, #0x1
mov x8, #0x40
svc #0x0
/* if byte in temp is "q", exit */
mov x5, #0x71
ldr x1, temp
cmp x1, x5
beq exit
/* otherwise, write it to stdout and repeat */
mov x0, #0x1
adr x1, temp
mov x2, #0x1
mov x8, #0x40
svc #0x0
b _start
exit:
/* exit cleanly */
eor x0, x0, x0
eor x1, x1, x1
eor x2, x2, x2
mov x8, #0x5D
svc #0x0
【问题讨论】:
-
你写错了换行符。
write需要一个地址而不是一个值。您需要执行类似newline: .byte 10的操作,然后传递其地址。 -
顺便说一下,这更像
cat而不是echo。 -
@Jester 谢谢!即使删除整个换行部分,read 调用也会读取超过 1 个字节,而底部的 write 调用会将其写出。我怎样才能将这些调用限制在 1 个字节(或 x 个字节),因为 x2 中的“计数”字段并没有真正做任何事情。
-
不,它一次只读取一个字节并打印它。然后它循环并读取并打印另一个。如果你修复换行部分而不是删除它,你会看到。
-
@old_timer ubuntu server 20.04 LTS 64-bit 在树莓派 4 上运行
标签: linux assembly buffer-overflow arm64