尝试将汇编程序字节流作为 C 本机函数执行
Trying to execute a assembler bytestream as a C native function
我试图用我在汇编中编写的 shellcode 地址覆盖 main() 的 return 地址。
我的汇编程序:
ExitShell.asm
SECTION .text
global _start
_start:
jmp short shellOffset
Shellcode:
pop esi
lea ecx, [esi]
mov dl, 12
mov bl, 1
mov al, 4
int 0x80
mov bl, 20
mov al, 1
int 0x80
shellOffset:
call Shellcode
msg db "Hello World",0xa
我正在覆盖 return 地址的 .c 文件:
ShellCode.c
#include<stdio.h>
char shellcode[] = "\xeb\x11\x5e\x8d\x0e\xb2\x0c\xb3\x01\xb0\x04\xcd\x80"\
"\xb3\x14\xb0\x01\xcd\x80\xe8\xea\xff\xff\xff"\
"\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x0a";
void main()
{
int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
}
我使用以下命令编译程序:
gcc -O0 -o sh ShellCode.c -fno-stack-protector -zexec -fno-asynchronous-unwind-tables -g
当我执行程序时,收到分段错误错误。将程序加载到gdb中,我发现它在程序集
中的ret语句中给出了错误
Dump of assembler code for function main:
0x080483b4 <+0>: push %ebp
0x080483b5 <+1>: mov %esp,%ebp
0x080483b7 <+3>: sub [=13=]x10,%esp
0x080483ba <+6>: lea -0x4(%ebp),%eax
0x080483bd <+9>: add [=13=]x8,%eax
0x080483c0 <+12>: mov %eax,-0x4(%ebp)
0x080483c3 <+15>: mov -0x4(%ebp),%eax
0x080483c6 <+18>: mov [=13=]x804a040,%edx
0x080483cb <+23>: mov %edx,(%eax)
0x080483cd <+25>: leave
=> 0x080483ce <+26>: ret
这是什么问题?我无法理解。请帮忙。我是新来的。
这可能有很多原因。您禁用了堆栈粉碎检测器,但这并不意味着 main 中的 ret
将在 return 地址之后立即分配。编译器和链接器在对齐变量地址以提高性能或满足 CPU 对齐要求方面有一些回旋余地。
另一个问题是,shellcode
将被放置在 .data
段中,该段可能被设置为不可执行,因此 main returning 到 shellcode 将触发该陷阱。
我试图用我在汇编中编写的 shellcode 地址覆盖 main() 的 return 地址。
我的汇编程序:
ExitShell.asm
SECTION .text
global _start
_start:
jmp short shellOffset
Shellcode:
pop esi
lea ecx, [esi]
mov dl, 12
mov bl, 1
mov al, 4
int 0x80
mov bl, 20
mov al, 1
int 0x80
shellOffset:
call Shellcode
msg db "Hello World",0xa
我正在覆盖 return 地址的 .c 文件:
ShellCode.c
#include<stdio.h>
char shellcode[] = "\xeb\x11\x5e\x8d\x0e\xb2\x0c\xb3\x01\xb0\x04\xcd\x80"\
"\xb3\x14\xb0\x01\xcd\x80\xe8\xea\xff\xff\xff"\
"\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x0a";
void main()
{
int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
}
我使用以下命令编译程序:
gcc -O0 -o sh ShellCode.c -fno-stack-protector -zexec -fno-asynchronous-unwind-tables -g
当我执行程序时,收到分段错误错误。将程序加载到gdb中,我发现它在程序集
中的ret语句中给出了错误Dump of assembler code for function main:
0x080483b4 <+0>: push %ebp
0x080483b5 <+1>: mov %esp,%ebp
0x080483b7 <+3>: sub [=13=]x10,%esp
0x080483ba <+6>: lea -0x4(%ebp),%eax
0x080483bd <+9>: add [=13=]x8,%eax
0x080483c0 <+12>: mov %eax,-0x4(%ebp)
0x080483c3 <+15>: mov -0x4(%ebp),%eax
0x080483c6 <+18>: mov [=13=]x804a040,%edx
0x080483cb <+23>: mov %edx,(%eax)
0x080483cd <+25>: leave
=> 0x080483ce <+26>: ret
这是什么问题?我无法理解。请帮忙。我是新来的。
这可能有很多原因。您禁用了堆栈粉碎检测器,但这并不意味着 main 中的 ret
将在 return 地址之后立即分配。编译器和链接器在对齐变量地址以提高性能或满足 CPU 对齐要求方面有一些回旋余地。
另一个问题是,shellcode
将被放置在 .data
段中,该段可能被设置为不可执行,因此 main returning 到 shellcode 将触发该陷阱。