【问题标题】:how to print a ascii string without storing in a variable assembly?如何在不存储在变量程序集中的情况下打印 ascii 字符串?
【发布时间】:2020-02-05 14:57:06
【问题描述】:

基本上,我想打印即汇编中的“0x41414141”或“AAAA”直接存储到ecx,我在下面试过但它不起作用:

SECTION .data
    buf: db "Hello", 5
SECTION .text
global _start

_start:
    mov eax, 0x41414141
    push eax
    pop ecx
    mov eax, 4
    mov ebx, 1
    mov edx, 4
    int 0x80

    mov eax, 1
    int 0x80

还尝试了诸如mov ecx, 0x41414141 之类的东西,但没有运气。

nasm -g -f elf -F dwarf ./shell.asm && ld -m elf_i386 -o shell shell.o在圆弧中编译代码:Linux kali 5.2.0-kali2-amd64 #1 SMP Debian 5.2.9-2kali1 (2019-08-22) x86_64 GNU/Linux

【问题讨论】:

  • 没有系统调用可以为您执行此操作。您必须自己将数字 0x41414141 转换为字符串 "0x41414141",然后打印该字符串。
  • 此外,write 系统调用将数据写入内存,而不是寄存器。没有办法解决这个问题。
  • 如果有一个“write single char”系统调用(与 DOS int 21h 一样),您可以连续执行几个这样的操作来写入您的数据,但 linux 没有——它仅从内存中写入字节。
  • 基本上是NASM printing out time - code doesn't output anything 的副本,但是这个问题比较模糊,没有一个好的简单答案可以真正回答这个问题。

标签: assembly nasm


【解决方案1】:

使用write 系统调用实际上是不可能的。 ecx 中的值应该是一个指针,指向要写入的字节缓冲区,而不是实际字节本身。

另一方面,您告诉 write 系统调用写入 5 个字节,但 0x41414141 将只有 4 个。

如果您想将十六进制数字打印为实际字符串"0x41414141",您需要先将数字转换为字符串,这样就更不可能了,因为它将是一个十进制的字符串(可能是空终止符不包括)字节(字符),不能放入 32 位(四字节)寄存器。

【讨论】:

  • @dude,我已将 5 字节更改为 4 字节,无论如何更新问题。
  • 忘了说我想打印“AAAA”
  • 在这种情况下,您可以将pop ecx 替换为mov ecx,esp。然后在执行完系统调用后放一个add esp,4来平衡堆栈。
  • @dude,哎呀,成功了。所以那将是,bc 它将 esp 指针移动到 ecx,对吗?
猜你喜欢
  • 2021-04-28
  • 2022-01-25
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 2021-10-21
相关资源
最近更新 更多