自学内容网 自学内容网

学习笔记——Test.pwn

前言:笔者也才接触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系统结构就好。(部分)

8c34e244204d4936834a96b028e0f188.png

83662fffa1554e71ab7475f396b5280f.png

 

C语言、汇编、机器码之间的关系:(我的认知噢)

C语言——>C伪代码——>汇编——>机器码

机器码—— 一对一 ——>汇编—— 没有 一对一关系 ——>C语言

 

补充说明,这里解释说明为什么,反汇编简单,反编译很难(因为没有 一 一对应关系)

也就说明,为什么ida中有时候会存在一些差异、gdb也会存在。

 

Pwn工具的介绍:

这里,目前能用到的。

ida —— 分析程序的逻辑,粗略的找到程序逻辑漏洞。

gdb —— 动态调试的方式,去走一遍程序。

python3 —— pwntools —— 集成pwn的攻击需要吧

pwntools——checksec 自带 能查看程序的安全属性。

ROPgadget —— 目前来看,查询程序本身的某些汇编指令及地址。

(这里仅说这些,因为笔者目前只用到这些)

 

正题:

学习时,简单入门的Pwn题:

<<< ret2text >>>

 

做题思路:目前来看,大致差不多如下:

一、先查看保护属性:

 

Arch              框架结构
RELRO         防止全局偏移表覆盖攻击
Stack            栈保护
NX                数据执行防护 》》》开启说明不能再堆栈上执行shellcode
PIE               随机化

764b457ecf0d451da88f549f16e6be54.png

从此上面能大致,判断什么攻击手段不能够使用,具体需要看代码。

 

二、ida打开:

5e715951383d41ca8f5572d2a542db5a.png

system() + "bin/sh" 这两组合是非常危险的。可以获取 shell 

 

查看main:

fb3c9c965d0e487788305bfb32f2d737.png

内容如下:

59139d5ddb9847aaa79581ce6fc24cce.png

 

system + bin/sh(对于此题而言,有就直接使用)

287de6d6ce094f9e8c4596ae525f0af2.png

 

三、gdb动态调试。

98b0b817e53040269697e3e2dccc43bf.png

按  r     进行运行程序到断点的地方。

如下:

d0cd82f1772145d19ad21d222eec95ca.png

思路,目前我们要看看程序的执行流程,进行自定义函数进行看看。

按 n 相当于 F8 步过

d4cea7676dcb430a8395e58695e3b38b.png

1af0d076502c4bb6a0bf484882025dd0.png

8fd3ccae086741189a5504379afa684c.png

如下以及分析:

30f12461c3894469ada0784cb74e9b28.png

你要知道,函数在栈中调用逻辑:

26ab09ddab8c4a3d926e5b6d331558f4.png

另类情况:

5d03040cf7744f97ba2fe6ea286331de.png

这种情况称之为——栈溢出。也是最常见,为害最大的函数。

 

fff6ca4fa00f4891bad7bab5b81115aa.png

不对,在栈中我们看到的是:

0330f0e845134c4fb5d94c593efee524.png

什么应该是16个字节——>>> 表明 ida中,数据结构有问题噢(要注意)

b09e880cc351479fb791be352c490e88.png

EBP栈针被淹没>>>发生了栈溢出漏洞。

 

exploit的方案、和思路。

1. 我们需要溢出的字节数:(思考?为什么不是从EBP - ESP 这是是 - EAX?——因为写入开始计算)

843d218bd3f54bcc9dc991ca6e615568.png

2.溢出指针——EBP(因为是32位架构 ——>4字节,64位架构 ——>8字节)

 

3.shellcode的编写。

此题有现成的。

7cab4b9f03094887bf90ab71d9794efa.png

payload,实际就是整合上面的步骤。

 

exp:

733e71a80dbd40dc99623a71ab553299.png

70d6236c51f34aedae934788b5151809.png

实例:

《 攻防世界 ——pwnstack 》

6314d4f1b784468e89d692f2355bc2a9.png

 

步骤如上:

1.查安全属性。

c797212acacc453da5ad37a3eea91d71.png

2.ida打开分析。

b9154230a84c4fa5ba75540c464e7c29.png

main:

5c6bff3941e24d96aec8d9b3d54ec32f.png

3.gdb 动调。

38accc16433343819164505a0c521b0c.png

dbb13eddef204e5cb4c52a1652ff2752.png

RBP ——>8字节

 

exploit编写:

1.溢出字节 ——> 160

2.溢出RBP指针 ——> 8

3.shellcode ——>0x0400762 (ida中看见的那个地址。)

payload 1+2+3 

exp:

ee9e9abc548642288ca68af38b0cfde3.png

0d6c975f77764edaa798fc4ab7c67192.png

 

在此基础上,加深一点点:

<<< ret2shellcode >>>

1.安全属性。

471cab2f2a5740fa80f7647ec28c7dd7.png

“可读可写可执行” - -什么程序都没开。

2.ida分析。

83447087f9aa4b06b5ea96ec84914ee9.png

0c362b51832d401eb87e148a1d7af907.png

bss段,存放未初始化数据段。

 

3.gdb 动调

97208e713eb54beca858fefad05946c3.png

b134dc543a6f406a96081582ed4ce5f1.png

 

exploit:

1.溢出字节 0x6C

2.溢出指针 0x4

3.shellcode编写——pwntools自带

payload 1+2+3

 

exp:

a64a7b43d7444919b891d4d3c8444138.png

8be66cf7c692448ea358f1d992844d88.png

总结,这题,需要理解Linux系统。

编写exp的思路,也是来源于安全属性的特征。

具体,之后会补充。

实例:

《待补》

 

<<< ret2syscall >>>

关于ROP的

1.安全属性

68d231d8858b4135a34262c1aa100421.png

2.ida分析

95563089e26248849986b7fdc99f57d7.png

548ea29203c84b3dac258b1ba199f34e.png

没有system函数了该怎么办?

system的原型内核函数:

0ed7145670344603898f387c55f8374a.png

此处涉及ROP(需要用)

 ROPgadget --binary 程序路径 --only "pop | ret" ——去构造找到程序调用的pop | ret

42094e5cf6694898b5968cb9bd20d305.png

【去筛选出,有用的。】

可以通过利用函数调用栈,控制ESP栈顶指针,去pop ret 我们想要的东西。

 

3.gdb 动调

d3f45a91074c4f0982b16d476aa59efd.png

a1858cd85a294d148dcf2c6e8a1d1371.png

 

exploit:

1.溢出字节 0x6C+ 2.指针字节 0x04(可以合并)

2.shellcode

3.payload 1+2

 

exp:

ecf68b064b3346e48c16eada9c786f2a.png

7ce3c79c5724430085d3e2e4c0871b46.png

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


原文地址:https://blog.csdn.net/shdbehdvd/article/details/143060609

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!