gpt4 book ai didi

linux - 从堆栈中弹出和打印 argc

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:59 26 4
gpt4 key购买 nike


根据this paper 和一些 stackoverflow 帖子,argc 在堆栈的顶部,argv 在它下面。我已经尝试了大约 3-4 种不同的方法:

  • 将其弹出到初始化变量 (.data) - 通过调用 printf 完成输出。
  • 将其弹出到未初始化的空间 (.bss) - 通过调用 sys_write()
  • 完成输出
  • 上述 + 调整的组合。

有人在论坛上告诉我 argcargv 不在堆栈中,我不明白;其他人是如何使用类似代码做到这一点的?

这是我尝试过的一个例子(3 天的知识值(value) - 尽量不要傻笑):

section .bss
argc: resd 1 ; alloc 4 bytes for popped value

section .text
global _start


_start:
pop dword[argc] ; pop argc, place in var
mov ebx,0x01 ; file descriptor = STDOUT
mov ecx,argc ; var (addr) - points to buffer
mov edx,1 ; length of buffer (single digit)
mov eax,0x04 ; syscall number for sys_write()
int 0x80 ; request the kernel to make syscall

exit:
mov ebx,0x00 ; arg for sys_exit() - sys_exit(0)
mov eax,0x01 ; syscall number for sys_exit()
int 0x80 ; request the kernel to make syscall

解决方法: 节.data msg db 值:%d\n

section .text
global main
extern printf

main:
push dword[esp+4]
push msg
call printf
add esp,8

mov eax,0
ret

最佳答案

获取 argc 的过程对我来说看起来没问题(对于 32 位 Linux 机器),尽管你少了 4 个字节,因为堆栈顶部很可能包含返回地址调用 main 的启动代码。
此外,sys_write 系统调用需要一个指向 ecx 中字符串的指针。你给它的是一个指向整数的指针,这不是一回事。
如果你想打印 argc 的值,你必须将它转换为字符串优先(或使用 printf 函数)。

下面是一些示例代码(我使用的是 GNU 汇编程序,因为我在这台机器上没有 NASM):

format: .asciz "%d\n"
.text
.globl main
.type main, @function
main:
pushl 4(%esp) # push argc
pushl $format # push the format string
call printf
addl $8,%esp # pop the arguments

movl $0, %eax # return value
ret

关于linux - 从堆栈中弹出和打印 argc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16036956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com