在有些情况下,我们需要知道 TLS 的位置以便于修改其中的一些值,例如 canary、tcache struct ptr、key。
但是在大多数情况下,远程的 ld.so 距离 libc 基址的位置不确定与本地 patchelf 之后的不一致,这时候优先可以考虑起一个 docker 来看看偏移(因为题目大多数都是用 docker 搭建的),我这里推荐这个项目:https://github.com/PIG-007/pwnDockerAll。
如果还是不正确,则说明我们需要爆破偏移,这里的爆破偏移和往常的不同,因为这个偏移值的量在每次连接的时候都是固定的,所以我们只要循环执行足够多的次数,那么就一定能够攻击成功。而且偏移的变化值往往在地址末尾的第四个、第五个数(末三位不变),我们只需要考虑爆破这两个数字即可。
这里提供一个爆破的模版,可以参考一下
for x in range(0x10):
for y in range(0x10):
try:
libc_base = 0x1234
offset = 0x6 << 20
offset += x << 16
offset += y << 12
ld_base = libc_base + offset
log.success("try offset:\t" + hex(offset))
# your code
sh.interactive()
except EOFError:
sh.close()
[...]第一种办法是爆破,参考wjh大佬的博客:https://blog.wjhwjhn.com/archives/593/[...]