我是 x86_64 汇编编程的新手。我正在用 x86_64 程序集编写简单的“Hello World”程序。下面是我的代码,它运行得很好。
global _start
section .data
msg: db "Hello to the world of SLAE64", 0x0a
mlen equ $-msg
section .text
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, mlen
syscall
mov rax, 60
mov rdi, 4
syscall
Run Code Online (Sandbox Code Playgroud)
现在,当我在 gdb 中反汇编时,它会给出以下输出:
(gdb) disas
Dump of assembler code for function _start:
=> 0x00000000004000b0 <+0>: mov eax,0x1
0x00000000004000b5 <+5>: mov edi,0x1
0x00000000004000ba <+10>: movabs rsi,0x6000d8
0x00000000004000c4 <+20>: mov edx,0x1d
0x00000000004000c9 <+25>: syscall
0x00000000004000cb <+27>: mov …Run Code Online (Sandbox Code Playgroud) 我正在尝试运行此代码来获取 shell,但即使禁用了 ASLR,我也会遇到分段错误。我在装有 Ubuntu 20.04 64 位版本的 AMD Ryzen 3 计算机上运行此代码。
我正在使用以下命令进行编译:
$ gcc -O0 -fno-stack-protector -z execstack getshell.c -o getshell
Run Code Online (Sandbox Code Playgroud)
文件getshell.c如下:
#include <stdio.h>
unsigned char shellcode[] = \
"\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05";
int main()
{
int (*ret)() = (int(*)())shellcode;
ret();
}
Run Code Online (Sandbox Code Playgroud)
编辑:我在这里找到了这段代码
我正在完成一项学校任务,我完全被难过了.教授和助教没有任何帮助,因为他们为任何学生提供的每一个答案都是"继续寻找,答案就在那里"的一些变化.我正在尝试使用以下代码创建一个shell:
#include <stdio.h>
#include <stdlib.h>
const char code[] =
"\x31\xc0"
"\x50"
"\x68""//sh"
"\x68""/bin"
"\x89\xe3"
"\x50"
"\x53"
"\x89\xe1"
"\x99"
"\xb0\x0b"
"\xcd\x80"
;
int main(int argc, char **argv)
{
printf("running...\n");
char buf[sizeof(code)];
strcpy(buf, code);
((void(*)( ))buf)( );
}
Run Code Online (Sandbox Code Playgroud)
我试图code[]用在网上找到的其他一些例子(包括这个网站)取代,以及教授提供的另一个例子.这些都没有用.我使用gdb进行反汇编并试图构建自己的code[],并且失败了.对于它的价值,我可以说,在普通用户中,我的应用程序会((void(*)( ))buf)( );在线路上发生段错误,只是在同一行的root用户中退出(没有段错误通知).
我不知道在哪里采取这个任务,我不能处理任何后来的缓冲区溢出任务,直到我能理解这个简单的第一步.任何帮助将大大赞赏.
编辑:我忘了提到,我已经在OSX 10.8.2上和通过VirtualBox在Ubuntu VM上尝试过这个.我假设它不适用于OSX,但我很绝望.ha对于Ubuntu,我们被要求做:
sudo #sysctl -w kernel.randomize_va_space = 0
sudo apt-get install zsh cd/bin sudo rm sh sudo ln -s/bin/zsh/bin/sh
这些命令应禁用地址空间随机化,安装zsh并将其链接到/ bin/sh.我在VM中完成了所有这些任务,没有任何错误
/*********
exit.asm
*/
[SECTION .text]
global _start
_start:
xor eax, eax
xor ebx, ebx
mov al, 1
int 0x80
//****************************
Run Code Online (Sandbox Code Playgroud)
首先,我使用nasm -f elf exit.asm生成目标文件.
然后我在我的Mac OS X 10.7上运行了以下"ld"命令,它有这些输出和警告,我试图在我的32位linux机器上运行它,一切都很顺利,请你解释为什么不会链接器在我的Mac上运行?
谢谢!
Alfred says: ld -o exiter exit.o
ld: warning: -arch not specified
ld: warning: -macosx_version_min not specified, assuming 10.7
ld: warning: ignoring file exit.o, file was built for unsupported file format ( 0x7f 0x45 0x4c 0x46 0x 1 0x 1 0x 1 0x 0 0x 0 0x 0 0x 0 0x 0 …Run Code Online (Sandbox Code Playgroud) 可以说我给了以下shellcode:
char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";
Run Code Online (Sandbox Code Playgroud)
如何检查它代表什么/它代表的ASM指令?谢谢 :)
有人可以帮我解释一下这些代码吗?
char code[] = "paste your shellcode here";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) code;
(int)(*func)();
}
Run Code Online (Sandbox Code Playgroud) 我有两个汇编代码,如下所示
file:a.asm
section .text
global _start
_start: mov eax, 4
mov ebx, 1
mov ecx, mesg
mov edx, 10
int 0x80
mov eax, 1
int 0x80
mesg db "KingKong",0xa
Run Code Online (Sandbox Code Playgroud)
和另一个汇编代码
档案:b.asm
section .text
global _start
_start: jmp mesg
prgm: mov eax, 4
mov ebx, 1
pop ecx
mov edx, 10
int 0x80
mov eax,1
int 0x80
mesg: call prgm
db "KingKong",0xa
Run Code Online (Sandbox Code Playgroud)
在获取这两个代码的十六进制并将其放入此C包装器之后
char *b = "\xb8\x04\x00\x00\x00\xbb\x01\x00\x00\x00\xb9\x7d\x80\x04\x08\xba\x0a\x00\x00\x00\xcd\x80\xb8\x01\x00\x00\x00\xcd\x80\x4b\x69\x6e\x67\x4b\x6f\x6e\x67\x0a";
char *b = "\xe9\x19\x00\x00\x00\xb8\x04\x00\x00\x00\xbb\x01\x00\x00\x00\x59\xba\x0a\x00\x00\x00\xcd\x80\xb8\x01\x00\x00\x00\xcd\x80\xe8\xe2\xff\xff\xff\x4b\x69\x6e\x67\x4b\x6f\x6e\x67\x0a";
int main()
{
(*(int (*)(void))a)();
}
Run Code Online (Sandbox Code Playgroud)
第一个汇编代码(b)按预期打印'KingKong',但第二个汇编代码a …
这是使用ctype运行shellcode的代码.shellcode在64位linux上运行"whoami".但是这个程序给了我一个"分段错误".但是我无法弄清楚它中的错误.代码的结构来自: ctypes:将字符串转换为函数?
#!/usr/bin/python
from ctypes import *
# /usr/bin/whoami
shellcode_data = ("\x6a\x3b\x58\x99\x48\xbb\x2f\x62\x69\x6e\x2f\x73\x68\x00\x53"
"\x48\x89\xe7\x68\x2d\x63\x00\x00\x48\x89\xe6\x52\xe8\x10\x00"
"\x00\x00\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x77\x68\x6f\x61"
"\x6d\x69\x00\x56\x57\x48\x89\xe6\x0f\x05");
shellcode = c_char_p(shellcode_data)
function = cast(shellcode, CFUNCTYPE(None))
function()
Run Code Online (Sandbox Code Playgroud)
对于32位架构,这将是shell代码:
shellcode_data = ("\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f\x73\x68"
"\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x10\x00\x00\x00\x2f"
"\x75\x73\x72\x2f\x62\x69\x6e\x2f\x77\x68\x6f\x61\x6d\x69\x00"
"\x57\x53\x89\xe1\xcd\x80");
Run Code Online (Sandbox Code Playgroud) 即使两个程序都遵守shellcode执行所需的相对寻址指令,并且两者都在执行时打印所需的消息,但第二个示例在用作shellcode时失败.谁能解释一下这种行为?奇怪的是,与第一个相同的第三个样本也失败了.
输出: 样本1 Hello World
其他样本(2和3)打印垃圾值
样品1
global _start
section .text
_start:
jmp widen
pHworld:
pop rsi
xor rax,rax
mov al,1
mov rdi,rax
mov rdx,rdi
add rdx,11
syscall
;Exit
xor rax,rax
mov rax,60
xor rdi,rdi
syscall
widen:
call pHworld
Hworld db "Hello World",0xa
样本2
global _start
section .text
_start:
call pHworld
Hworld db "Hello World",0xa
pHworld:
pop rsi
xor rax,rax
mov al,1
mov rdi,rax
mov rdx,rdi
add rdx,11
syscall
;Exit
xor rax,rax
mov rax,60
xor rdi,rdi … 我在汇编中有以下代码:
global _start
section .rodata
hello: db "Hello World!", 10
section .text
_start:
mov eax,4
mov ebx,1
mov ecx,hello
mov edx,13
int 80h
; Terminate program
mov eax,1
xor ebx,ebx
int 80h
Run Code Online (Sandbox Code Playgroud)
如果我使用以下代码的objdump,则会得到:
如果我在objdump中得到了NUL字符,则将无法完成我正在处理的任务。我如何在没有任何NUL(0x00)字节的情况下获取objdump?
shellcode ×10
assembly ×7
c ×3
nasm ×3
linux ×2
x86 ×2
x86-64 ×2
ctype ×1
machine-code ×1
objdump ×1
python ×1
stack-smash ×1
system-calls ×1