开发者

How can I call sprintf from x86_64 assembly?

I am trying to convert a double to a string on the stack from x86_64 assembly code:

        bs.code += isa.movsd(registers.xmm0, MemRef(registers.rsp))
        bs.code += isa.pop(registers.rax)

        bs.code += isa.push(registers.rbp)
        bs.code += isa.mov(registers.rbp, registers.rsp)

        bs.c开发者_StackOverflow社区ode += isa.sub(registers.rsp, 100)
        bs.code += isa.and_(registers.rsp, -16)

        bs.code += isa.mov(registers.rdi, registers.rsp)
        bs.code += isa.mov(registers.rsi, <address of "%i\0">)
        bs.code += isa.mov(registers.rax, <address of sprintf in libc>)
        bs.code += isa.call(registers.rax)

The program segfaults at call(rax) with

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6a2919b in *__GI___overflow (f=0x7fffffffb5d0, ch=9698128) at genops.c:248
warning: Source file is more recent than executable.
248   return _IO_OVERFLOW (f, ch);

I think sprintf has to be called specially because it uses variable arguments, so can anybody advise on the proper way to do this from assembly?


Would it help if you write a simple call to sprintf in C and use gcc -s foo.c ?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜