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
相关产品推荐
相关产品推荐

