我正在尝试学习汇编和shellcode。我有一个问题一直让我疯了几天。我已经编写了一些程序集来对execve进行系统调用。组装的文件可以工作,但是当我将它转换为shellcode并尝试从C程序运行它时,我得到了一个分段错误。我尝试了各种各样的变化,但没有任何作用。目前,nasm代码如下:
global _start
section .data
cmd: db '/bin/netcat', 0
argv0: db 'netcat', 0
argv1: db '127.0.0.1', 0
argv2: db '3333', 0
argv: dd argv0, argv1, argv2, 0
section .text
_start:
mov ebx, cmd ; filename parameter
mov ecx, argv ; argv parameter
xor edx, edx ; envp parameter
mov al, 11 ; execve system call number. Moving to al rather than eax to prevent null bytes in shellcode.
int 0x80
; exit
xor ebx, ebx ; status code 0
mov al, 1 ; sys_exit
int 0x80
我用以下命令组装了这个:
nasm -f elf32 test.asm -o test.o && ld -m elf_i386 test.o -o test
运行测试工作正常。我使用this page中的命令从test中获取了shellcode,当然,用./test替换了./PROGRAM。
最后,我有以下C代码:
unsigned char[] = "\xbb\x98\x90\x04\x08\xb9\xba\x90\x04\x08\x31\xd2\xb0\x0b\xcd\x80\xb0\x01\x31\xdb\xcd\x80";
main()
{
int (*ret)() = (int(*)())code;
ret();
}
编译:
gcc -g -m32 -fno-stack-protector -z execstack testshellcode.c -o testshellcode
运行testshellcode会导致分段错误。我尝试了各种各样的东西,比如使代码成为const,使用不同的标志进行编译,以及大约1,000种nasm代码的变体。我已成功运行调用execve的其他shellcode,但在这些情况下argv很简单。
使用gdb,我可以看到它在调用ret()时崩溃。查看分段错误后的寄存器:
eax 0xffffffda -38
ecx 0x80490ba 134516922
edx 0x0 0
ebx 0x0 0
esp 0xbffff14c 0xbffff14c
ebp 0xbffff178 0xbffff178
eip 0x804a03a 0x804a03a <code+22>
eflags 0x10246 [ PF ZF IF RF ]
任何帮助都将受到高度赞赏。