Java变量偏移_短跳,相对偏移不使用我期望的偏移

我想了解简短的jmp指令 . 我有一个非常简单的程序,用nasm编译:

SECTION .data

bsh: db "/bin/sh",0

arr: dq bsh,0

SECTION .text

global main

main:

jmp short 0x20

mov edx, 0

mov rsi, arr

mov rdi, bsh

mov rax, 0x3b

syscall

mov ebx, 0

mov eax, 0x3c

syscall

反汇编,代码在gdb中看起来像这样(反汇编主):

0x00000000004000b0 : jmp 0x4000d1

0x00000000004000b2 : mov $0x0,%edx

0x00000000004000b7 : movabs $0x6000e8,%rsi

0x00000000004000c1 : movabs $0x6000e0,%rdi

0x00000000004000cb : mov $0x3b,%eax

0x00000000004000d0 : syscall

0x00000000004000d2 : mov $0x0,%ebx

0x00000000004000d7 : mov $0x3c,%eax

0x00000000004000dc : syscall

我想跳到 0x4000d2 . 34 - 2 = 32 = 0x20 . 0x4000d2 - 0x4000b2 = 0x20 . 无论我组装什么,nasm似乎总是将跳转地址编码为跳过指令开始后一个字节的偏移量 . 为什么 jmp short 0x20 组装错误? (更不用说 jmp 0x20 有不同的结果,并且是5字节指令而不是2字节指令)

我也在阅读smashing the stack for fun and profit . Aleph1想要从jmp跳转到call,然后从call到popl . 这是他使用的代码:

jmp 0x26 # 2 bytes

popl %esi # 1 byte

movl %esi,0x8(%esi) # 3 bytes

movb $0x0,0x7(%esi) # 4 bytes

movl $0x0,0xc(%esi) # 7 bytes

movl $0xb,%eax # 5 bytes

movl %esi,%ebx # 2 bytes

leal 0x8(%esi),%ecx # 3 bytes

leal 0xc(%esi),%edx # 3 bytes

int $0x80 # 2 bytes

movl $0x1, %eax # 5 bytes

movl $0x0, %ebx # 5 bytes

int $0x80 # 2 bytes

call -0x2b # 5 bytes

.string \"/bin/sh\" # 8 bytes

将 popl %esi 中的字节加到 call -0x2b 我得到42.第一条指令不应该是 jmp 0x2a 吗?并且从调用指令的末尾减去字节到 popl %esi 的开头我得到-47 . 不应该打电话 call -0x2f ?当他实际创建一个c文件并将他的程序集放在 __asm__ 块中时,他使用我计算的偏移量,但不是在此之前的代码中 . 改变了什么?

虽然我在这里,他不能只是访问eip并用它来获取内存中字符串的相对偏移量吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值