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")
即可