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为例
利用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也可以转化手写的汇编指令