我找到了一篇有关自我修改代码的文章,并尝试做一些示例,但是我总是遇到分段错误。据我所了解,fas违反了内存权限。代码段是(r)ead /
e(x)ecute,因此尝试将结果写入此错误。是否可以通过在运行时或之前更改内存许可来测试程序?我使用的是linux,示例是用GAS汇编编写的。
.extern memcpy
.section .data
string:
.asciz "whatever"
string_end:
.section .bss
.lcomm buf, string_end-string
.section .text
.globl main
main:
call changer
mov $string, %edx
label:
push string_end-string
push $buf
push $string
call memcpy
changer:
mov $offset_to_write, %esi
mov $label, %edi
mov $0xb, %ecx
loop1:
lodsb
stosb
loop loop1
ret
offset_to_write:
push 0
call exit
end:
因此,在osgx建议的修改之后,这是一个有效的代码(实际上,如果您汇编并链接并运行它会崩溃,但是如果您使用gdb观看它会修改其代码!)
.extern memcpy
.section .data
string:
.asciz "Giorgos"
string_end:
.section .bss
.lcomm buf, string_end-string
.section .text
.globl main
main:
lea (main), %esi # get the start of memory region to
# change its permissions (smc-enabled)
andl $0xFFFFF000, %esi # align to start of a pagesize
pushl $7 # permissions==r|w|x
pushl $4096 # page size
pushl %esi # computed start address
call mprotect
call changer # function that does smc
mov $string, %edx
label:
push string_end-string # this code will be overridden
push $buf # and never be executed!
push $string
call memcpy
changer:
mov $offset_to_write, %esi # simple copy bytes algorithm
mov $label, %edi
mov $0xb, %ecx
loop1:
lodsb
stosb
loop loop1
ret
offset_to_write: # these instructions will be
push $0 # executed eventually
call exit
end:
您应该在运行时更改内存访问权限。
#include <sys/mman.h>
void *addr = get_address_of_instruction_pointer();
int length = 4096; /* size of a page */
if (mprotect(addr, length, PROT_READ | PROT_WRITE | PROT_EXEC) == 0) {
/* current code page is now writable and code from it is allowed for execution */
}
问题内容: tl;博士:我试图在运行Ubuntu 12.10(定量)的基于ARMv7的Cubox上安装node.js。从源代码编译node.js时(请参见下面的“第二次尝试”),会产生分段错误。我在这里可以做什么? 第一次尝试 首先,我尝试按照此处提供的针对Ubuntu的说明,通过软件包管理器安装node.js:通过软件包管理器安装Node.js:Ubuntu,Mint 使用此处添加提到的存储库似
问题内容: 您是否曾经用Java 创建或遇到过自我修改的代码?如果是,请发布链接或直接发布代码。 问题答案: 忽略悲伤世界,您可能会通过自我修改代码(!)导致自己陷入困境,在我看来,这里有3种选择: 使用Java 6的内置编译器支持以及写入/重新编译/重新加载类 使用Apache BCEL字节码操作库直接编写您的类 利用Java 6的内置脚本支持(或使用Apache BSF)以您选择的JVM脚本语
我的代码: 错误: 第8行的错误1064(42000):您的SQL语法中有一个错误;请查看与您的MySQL服务器版本相对应的手册,以便在第9行')'附近使用正确的语法
一般的技术被称为“子程序线程”(或“调用线程”,尽管这也有其他定义)。目标是利用处理器有效的调用/RET预测,以避免停顿。这里详细描述了该方法:http://webdocs.cs.ualberta.ca/~amaral/cascon/cdp05/slides/cdp05-berndl.pdf 生成的代码只是一系列的调用,后面跟着一个返回。如果有5个“块”的宽度[4,8,8,4,16],它看起来像:
1、修改AndroidManifest.xml文件 1.添加权限和服务,参考demo <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission androi
问题内容: 我尝试使用输入四个浮点数,将它们存储到堆栈中,然后使用将它们复制到寄存器中以供使用。我的问题是,当我尝试输出这4个数字时,程序seg错误出现在。 我认为它与堆栈有关,但是我尝试多次弹出(一次执行多个指令)无济于事。我还是汇编语言的新手,所以使用它对于我来说有点太先进了。 您会注意到我包含了一个名为的文件。它使我能够查看寄存器和堆栈(这就是为什么要有指令的原因。)这是由我的教授提供的,它