取当前eip 汇编_gcc - 如何通过gcc从x86内联汇编获取EIP - 堆栈内存溢出

听起来这不太可能有用(与仅接受整个函数的地址,如void *tmp = main ),但这是可能的。只需获取标签地址,或使用即可. (当前行的地址),并让链接程序担心将正确的立即数添加到机器代码中。 因此,您不必从体系结构上读取EIP ,而只是从即时读取当前值。asm volatile("mov $., %0" : "=r"(address_of_mov_instruction) );AT&T...
摘要由CSDN通过智能技术生成

听起来这不太可能有用(与仅接受整个函数的地址,如void *tmp = main ),但这是可能的。

只需获取标签地址,或使用即可. (当前行的地址),并让链接程序担心将正确的立即数添加到机器代码中。 因此,您不必从体系结构上读取EIP ,而只是从即时读取当前值。

asm volatile("mov $., %0" : "=r"(address_of_mov_instruction) );

AT&T的语法是mov src, dst ,因此,如果汇编的话,您写的内容将是跳转。

(在架构上,EIP =一条指令在执行时的结尾 ,因此可以说您应该这样做

asm volatile(

"mov $1f, %0 \n\t" // reference label 1 forward

"1:" // GAS local label

"=r"(address_after_mov)

);

我正在使用asm volatile ,以防此asm语句通过内联或其他方式在同一函数内多次重复。 如果您希望每种情况获得不同的地址,则必须是volatile 。 否则,编译器可以假定此asm语句的所有实例都产生相同的输出。 通常情况下会没事的。

从体系结构上讲,在32位模式下,您没有针对LEA的RIP相对寻址,因此实际读取EIP的唯一好方法是调用/弹出。 它不是通用寄存器,因此您不能仅将其用作mov或任何其他指令的源或目的地。

但实际上您根本不需要内联汇编。 显示了如何使用&&label为其地址的GNU C扩展。

int

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值