炸弹实验Phase1:如何获取指定地址的目标字符串?
破解炸弹实验Phase1:正确获取目标比对字符串的方法
核心问题:误用错误地址,需先计算RIP相对寻址的实际目标地址
x86-64架构中0x1bbc(%rip)是RIP相对寻址,不能直接用0x1bbc作为地址,必须结合当前指令的RIP值计算实际目标地址,步骤如下:
定位Phase1中字符串比对相关指令
在GDB中执行disas phase_1,查看Phase1的汇编代码,找到包含0x1bbc(%rip)的指令(通常是lea指令,用于加载目标字符串地址到寄存器,供strcmp类函数调用)。计算目标地址
RIP相对寻址的公式为:目标地址 = 当前指令的下一条指令地址 + 偏移量(0x1bbc)
- 假设包含
0x1bbc(%rip)的指令地址是0x400eec(以实际汇编输出为准),先确定这条指令的长度:执行x/i 0x400eec查看指令,比如这条lea指令长度为7字节,那么下一条指令地址是0x400eec + 7 = 0x400ef3。 - 加上偏移量0x1bbc:
0x400ef3 + 0x1bbc = 0x402aa8(这就是目标字符串的实际地址,不同炸弹的地址会有差异)。
- 查看正确字符串
执行GDB命令x/s 0x402aa8(替换为你计算出的实际地址),即可得到Phase1需要的正确比对字符串。
为什么0x15bd会输出乱码?
你查看的0x15bd并非RIP相对寻址计算后的目标地址,该地址存储的内容不是以\0结尾的合法ASCII字符串,x/s命令会从该地址开始输出字节直到遇到第一个\0,因此会出现不可打印的乱码。
内容的提问来源于stack exchange,提问作者zeliha
相关产品推荐
相关产品推荐

