shellcode的概念

shellcode是一段特定的代码,可以不用编译让程序直接进行执行的一段代码。当程序没有开启NX保护时,可以通过编写shellcode,让程序执行这段代码来获得flag或者shell

汇编语言

在写shellcode之前要简单认识下汇编语言

汇编指令

mov

​ mov a,b 将b的值赋给a

​ eg:mov rax,0x50 将0x50赋值给rax

add

​ add a,b 将b加到a

​ 可解释为 a=a+b

push和pop

​ push a 将a压入到栈中,栈增大

​ a可以是数据,也可以是寄存器

​ pop b 将栈顶的值弹出,栈减小,把弹出的值赋给b

xor

​ xor a,b 将a和b进行异或运算

​ 自己对自己异或结果为0,因此可用于清空寄存器

中括号[]

​ 进行寻址操作

​ mov ax,[bx] 把bx所储存地址所指向的值赋给ax

ret和call

​ call xxx 调用某个函数 相当于 push retaddr(返回地址); jmp xxx

​ ret xxx 函数调用完后返回,相当于pop ip;jmp ip 若没进行特殊修改,ip一般为函数返回地址

leave

​ 把栈顶和栈底的寄存器归位

寄存器(64位)

rax

​ 存放函数的返回值,或者是在函数调用前存放系统调用号

rdi,rsi,rdx,rcx,r8,r9

​ 存放函数调用的前六个参数,在系统调用的情况下,rcx要换成r10

rsp,rbp

​ 存放栈顶和栈底的地址,每次pop和push时rsp在变,rbp不变

rip

​ 64位的ip寄存器,存放下一条指令的地址

cs

​ cs=0x23代表32位模式,0x33代表64位模式

eflags

​ 标志位寄存器,其中有个ZF标志位,当前面操作结果为0,ZF设为1,前面结果不为0,ZF设为0

​ ZF为1时 je等汇编指令会进行跳转,反之则不会

寄存器的构造,以rax为例

1

利用pwntools写shellcode

shellcraft

shellcraft自动生成

eg shellcraft.read(3,buf,0x100) 就会自动生成read的汇编代码,注意要在context里设置好os和arch

​ shellcraft.sh() 会自动生成execve来执行binsh获得shell

asm

asm是把汇编语言转化成机器码,只有这样才能被计算机识别

asm(shellcraft,sh(),arch=’xxx’,os=’xx’)后两个参数可以提前设置好

asm也可以转化手写的汇编指令

实例

24集训week1