我试图用我在汇编中写的shellcode的地址覆盖main()的返回地址。
我的汇编程序:
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
我的.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 $0x10,%esp
0x080483ba <+6>: lea -0x4(%ebp),%eax
0x080483bd <+9>: add $0x8,%eax
0x080483c0 <+12>: mov %eax,-0x4(%ebp)
0x080483c3 <+15>: mov -0x4(%ebp),%eax
0x080483c6 <+18>: mov $0x804a040,%edx
0x080483cb <+23>: mov %edx,(%eax)
0x080483cd <+25>: leave
=> 0x080483ce <+26>: ret
问题是什么?我无法理解。请帮忙。我是新来的。
答案 0 :(得分:3)
这可能有很多原因。您禁用了堆栈粉碎检测器,但这并不意味着,main中的ret
将在返回地址之后立即分配。编译器和链接器在调整变量时有一些余地。地址以提高性能或满足CPU对齐要求。
另一个问题是,shellcode
将放置在.data
段中,可能设置为不可执行,因此主要返回shellcode会触发该陷阱。