Context
context(arch = 'i386', os = 'linux',log_level='debug'
) 设置目标机的信息
arch设置架构为amd64,可以简单的认为设置为64位的模式,对应的32位模式是’i386’
log_level设置日志输出的等级为debug,这句话在调试的时候一般会设置,这样pwntools会将完整的io过程都打印下来,使得调试更加方便,可以避免在完成CTF题目时出现一些和IO相关的错误。
r = remote('exploitme.example.com', 31337) 用来建立一个远程连接,url或者ip作为地址,然后指明端口
asm(shellcraft.sh()) asm()函数接收一个字符串作为参数,得到汇编码的机器代码
checksec
checksec可以查看当前二进制文件的指令架构以及采取了哪些保护机制
需要特别注意目标进程是否开启了DEP(Linux下对应NX(No Execute))、ASLR(Linux下对应PIE)等机制,
例如存在DEP(NX)的话就不能直接执行栈上的数据,存在ASLR的话各个系统调用的地址就是随机化的
程序保护
- CANARY:canary英文为金丝雀,意指曾今矿工用金丝雀的存活与否来确认矿地中是否有有毒。在这里我们就是用这个canary指值来确认栈是否溢出。
- NX:开启的NX保护的程序是堆栈不可执行的。所以以前常用的
jmp esp
,jmp rsp
等跳板技术跳到栈中执行shellcode的技术就不能用了。 - ASLR:Address space layout randomization地址空间布局随机化技术。这里的地址随机化仅仅视对用户态的,不是内核的地址随机,内核的地址的分布还是使用的固定虚拟地址。关闭地址随机化的选项
在编译时加入-fno-stack-protector和-z execstack
gcc -fno-stack-protector -z execstack -o level1 level1.c 这个命令编译程序。-fno-stack-protector和-z execstack这两个参数会分别关掉DEP和Stack Protector