You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux AttackLab touch2运行后代码地址变更及编译错误求解

AttackLab touch2任务地址问题解决方案

问题原因解析

  • 静态查询的0x19f9是相对偏移地址,程序运行时开启了ASLR(地址空间随机化),实际加载的虚拟地址是带前缀的0x5555555559f9,所以用短地址会验证失败。
  • 直接push $0x5555555559f9报错是因为x86-64架构的GNU汇编器(gas)不支持直接push 64位立即数,存在操作数类型不匹配的限制。

解决方法

方法1:借助寄存器中转(推荐)

通过mov指令将64位地址存入通用寄存器,再push寄存器内容,示例代码:

; 先将touch2的完整地址存入rax寄存器
movq $0x5555555559f9, %rax
; 再push寄存器中的地址
push %rax

方法2:拆分地址构造64位值

利用x86-64中push 32位立即数会自动零扩展到64位的特性,先push高32位,再修改栈上的低32位:

; push高32位,自动零扩展为64位
push $0x55555555
; 将低32位地址存入rax
movq $0x59f9, %rax
; 修改栈上的低4字节,组合成完整的64位地址
movq %rax, 4(%rsp)

额外注意事项

  • 确保使用AT&T汇编语法:立即数前加$,寄存器名前加%,这是AttackLab环境默认的汇编格式。
  • 编译时使用正确的命令,比如gcc -c answer2.s -o answer2.o,再通过objdump检查生成的机器码是否正确。

内容的提问来源于stack exchange,提问作者donggeon lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:01:08