写入代码段时编程接收信号SIGSEGV

Tig*_*ran 0 c exploit

Program received signal SIGSEGV试图覆盖调用指令的地址时遇到错误.
我将调用参数的地址(地址0x8048579)存储在eax中,将新值存储在edx(0xb7fb773a)中.根据我的理解说明mov %edx,(%eax)应该这样做,但它失败了.
我做错了什么?
这是我大学任务的一部分,所以没有真正的系统受到伤害:-)

码:

   0x08048566 <+35>:    mov    -0x8(%ebp),%edx
   0x08048569 <+38>:    mov    -0x4(%ebp),%eax
=> 0x0804856c <+41>:    mov    %edx,(%eax)    // Fails here.
   0x0804856e <+43>:    movl   $0x0,(%esp)
   0x08048575 <+50>:    call   0x8048370 <_exit@plt>
Run Code Online (Sandbox Code Playgroud)

寄存器:

eax            0x8048579    134514041   
edx            0xb7fb773a   -1208256710  
Run Code Online (Sandbox Code Playgroud)

失败:

Program received signal SIGSEGV, Segmentation fault.
0x0804856c in foo (argv=0x58575655) at my_code.c:34
Run Code Online (Sandbox Code Playgroud)

//更新1:CPU信息:

Architecture:          i686
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 69
Stepping:              1
CPU MHz:               2306.609
BogoMIPS:              4613.21
L1d cache:             32K
L1d cache:             32K
L2d cache:             6144K
Run Code Online (Sandbox Code Playgroud)

Paw*_*ski 5

指令mov %edx,(%eax)确实将EDX寄存器值保存到EAX指向的存储器地址.

此代码失败,因为Linux上的ELF可执行文件的代码段(.text)不可写.因此,写入此部分会导致来自OS的SIGSEGV信号.

您可能对此问题的答案感兴趣:如何使GCC将.text段编译为ELF二进制文件中的可写?