前言:笔者也才接触Pwn,写这篇wp,记录目前所得感悟、思考、理解等。
存在错误,或者解释不通的地方,还请提出,已补足笔记的缺陷。
Pwn是什么?
我Pwn掉了你的电脑、我Pwn掉了你的设备……
通俗的讲,Pwn,大概就是,取得你所掌握的权限,或者高于你的权限。从而达到某些目的。
而,接触Pwn必不可少会接触三个词语:(我的理解)
exploit —— 编写攻击脚本的方案与策划
shellcode —— 取得对方交互,命令行
payload —— 攻击代码
以目前,笔者的学识,理解也不会很深入。
学习Pwn必备的知识:
多的不说,C语言、python、汇编语言、操作系统等
思考:对于CTF Pwn的题目,为什么大多都是Linux文件为主?
因为Linux开源、免费;Windows闭源,具体不多赘述。
reverse 涉及Windows程序、Linux程序都挺频繁的。
所以,以我目前的学习来说,
笔者认为,
如果想快速入门Pwn,C语言的基础不能少,至少要知道C语言常见的函数、数据类型格式、以及指针的大小等。
【核心】汇编语言,咱当时看的是王爽的。汇编寄存器、标志位、JCC家族、常见汇编指令(如mov、push、pop、ret、lea等)操作流程。【最最核心,对于函数调用栈的理解——Stack,例如bp指针始终指向栈底,sp指针始终指向栈顶。压栈出栈规则——后进先出、增长空间是由大到小的等。
函数调用常规肯定会有如下结构:
push ebp
mov ebp ,ebsp
sub esp,100 开辟100字节的栈空间
....
leave /pop 恢复到堆栈平衡
ret
等等,不在过多赘述。
【核心】 Pwn以Linux 为多。
所以重点抓住Linux系统结构就好。(部分)
C语言、汇编、机器码之间的关系:(我的认知噢)
C语言——>C伪代码——>汇编——>机器码
机器码—— 一对一 ——>汇编—— 没有 一对一关系 ——>C语言
补充说明,这里解释说明为什么,反汇编简单,反编译很难(因为没有 一 一对应关系)
也就说明,为什么ida中有时候会存在一些差异、gdb也会存在。
Pwn工具的介绍:
这里,目前能用到的。
ida —— 分析程序的逻辑,粗略的找到程序逻辑漏洞。
gdb —— 动态调试的方式,去走一遍程序。
python3 —— pwntools —— 集成pwn的攻击需要吧
pwntools——checksec 自带 能查看程序的安全属性。
ROPgadget —— 目前来看,查询程序本身的某些汇编指令及地址。
(这里仅说这些,因为笔者目前只用到这些)
正题:
学习时,简单入门的Pwn题:
<<< ret2text >>>
做题思路:目前来看,大致差不多如下:
一、先查看保护属性:
Arch 框架结构
RELRO 防止全局偏移表覆盖攻击
Stack 栈保护
NX 数据执行防护 》》》开启说明不能再堆栈上执行shellcode
PIE 随机化
从此上面能大致,判断什么攻击手段不能够使用,具体需要看代码。
二、ida打开:
system() + "bin/sh" 这两组合是非常危险的。可以获取 shell
查看main:
内容如下:
system + bin/sh(对于此题而言,有就直接使用)
三、gdb动态调试。
按 r 进行运行程序到断点的地方。
如下:
思路,目前我们要看看程序的执行流程,进行自定义函数进行看看。
按 n 相当于 F8 步过
如下以及分析:
你要知道,函数在栈中调用逻辑:
另类情况:
这种情况称之为——栈溢出。也是最常见,为害最大的函数。
不对,在栈中我们看到的是:
什么应该是16个字节——>>> 表明 ida中,数据结构有问题噢(要注意)
EBP栈针被淹没>>>发生了栈溢出漏洞。
exploit的方案、和思路。
1. 我们需要溢出的字节数:(思考?为什么不是从EBP - ESP 这是是 - EAX?——因为写入开始计算)
2.溢出指针——EBP(因为是32位架构 ——>4字节,64位架构 ——>8字节)
3.shellcode的编写。
此题有现成的。
payload,实际就是整合上面的步骤。
exp:
实例:
《 攻防世界 ——pwnstack 》
步骤如上:
1.查安全属性。
2.ida打开分析。
main:
3.gdb 动调。
RBP ——>8字节
exploit编写:
1.溢出字节 ——> 160
2.溢出RBP指针 ——> 8
3.shellcode ——>0x0400762 (ida中看见的那个地址。)
payload 1+2+3
exp:
在此基础上,加深一点点:
<<< ret2shellcode >>>
1.安全属性。
“可读可写可执行” - -什么程序都没开。
2.ida分析。
bss段,存放未初始化数据段。
3.gdb 动调
exploit:
1.溢出字节 0x6C
2.溢出指针 0x4
3.shellcode编写——pwntools自带
payload 1+2+3
exp:
总结,这题,需要理解Linux系统。
编写exp的思路,也是来源于安全属性的特征。
具体,之后会补充。
实例:
《待补》
<<< ret2syscall >>>
关于ROP的
1.安全属性
2.ida分析
没有system函数了该怎么办?
system的原型内核函数:
此处涉及ROP(需要用)
ROPgadget --binary 程序路径 --only "pop | ret" ——去构造找到程序调用的pop | ret
【去筛选出,有用的。】
可以通过利用函数调用栈,控制ESP栈顶指针,去pop ret 我们想要的东西。
3.gdb 动调
exploit:
1.溢出字节 0x6C+ 2.指针字节 0x04(可以合并)
2.shellcode
3.payload 1+2
exp: