利用和间接寻址

时间:2018-01-31 04:14:41

标签: gcc assembly x86-64 gas att

为什么要替换

movl    $84, 3(%rsi)

movl    $3, %ecx
leal    (%esi, %ecx, 1), %r11d
movl    $84, (%r11d)

结果为Segmentation fault (core dumped),我该如何解决?

(稍后我将使用%ecx作为计数器来循环遍历数组)

据我了解,movl $84, 3(%rsi)将字面值84(ASCII' T')移动到result[2](根据打印输出正常工作和更正:{{1} }})

另一方面,

   24 = 02aTa

第1行将整数值3移动到movl $3, %ecx leal (%esi, %ecx, 1), %r11d movl $84, (%r11d)
第2行计算的%ecx = %esi + 1 * %ecx%esi + %ecx相同(不正确,因为它不起作用)
第3行将整数值84(' T')移动到上面的地址(应该与3(%esi)相同)

使用movl $84, 3(%rsi)替换%esi等等(包括使用%rsileaq)在非工作部分,我得

movq

所以我的问题是:如何实现*** stack smashing detected ***: ./a.out terminated Aborted (core dumped) 的效果?

使用movl $84, %ecx(%esi)

进行编译

的main.c

gcc main.c helper.s


helper.s

#include <stdio.h>

void helper(unsigned int value, char * result);

int main() {
    char result[6];

    helper(24, result);
    printf("%5u = %s\n", 24, result);

    return 0;
}

.globl helper helper: # 0 movl $48, 0(%rsi) # 2 movl $50, 1(%rsi) # a movl $97, 2(%rsi) #ifdef DEBUG # T movl $84, 3(%rsi) #ELSE /* movl $3, %ecx leal (%esi, %ecx, 1), %r11d # T movl $84, (%r11d) */ #ENDIF # a movl $97, 4(%rsi) movl $0x0000000000000000, 5(%rsi) ret 替换所有%rsi(以及32位寄存器的所有64位寄存器),我得到%esi。这是为什么?

0 个答案:

没有答案