这篇文档是我在入门pwn过程中的一些学习记录。包括工具的安装以及一些背景知识。
0 pwntools
0.1 安装
https://github.com/Gallopsled/pwntools
https://www.jianshu.com/p/fbfce9cf5190
0.2 使用
1 | # p32 p64 编码 |
1 GCC 编译选项
1 | -fno-stack-protector #关闭canary 不开启堆栈溢出保护 |
- BSS Segment 用来存放程序中未初始化的全局/静态变量的一块内存区域,属于静态内存分配,其全称为 Block Started by Symbol 。
- DATA Segment 保存已经初始化的全局变量,属于静态内存分配。
- TEXT Segment 用来存放真正执行的代码,大小在编译后已经确定,一般是只读。
- HEAP Segment 保存堆的内容,一般是通过 malloc() 动态分配的内存。
- STACK Segment 栈空间,一般是存放程序临时创建的局部变量。
2 IDA 使用技巧
第一次入门IDA也不是很会用,一番摸索才知道可以通过F5查看伪源码,右键查看text view可以看到全部反汇编的代码。
3 栈溢出基础
3.1 相关知识
eax 被称为累加寄存器(Accumulator),用以进行算数运算和返回函数结果等。ebx 被称为基址寄存器(Base),在内存寻址时(比如数组运算)用以存放基地址。ecx 被称为记数寄存器(Counter),用以在循环过程中记数。edx 被称为数据寄存器(Data),常配合 eax 一起存放运算结果等数据。[3]
现代操作系统内存通常是以分段的形式存放不同类型的信息的。我们在上篇谈及的函数调用栈就是分段的一个部分(Stack Segment)。内存分段还包括堆(Heap Segment)、数据段(Data Segment),BSS段,以及代码段(Code Segment)。代码段存储可执行代码和只读常量(如常量字符串),属性可读可执行,但通常不可写。数据段存储已经初始化且初值不为0的全局变量和静态局部变量,BSS段存储未初始化或初值为0的全局变量和静态局部变量,这两段数据都有可写的属性。堆用于存放程序运行中动态分配的内存,例如C语言中的 malloc() 和 free() 函数就是在堆上分配和释放内存。[3]
3.2 函数调用流程
可以按次序简单概括为3点:
参数入栈
返回地址入栈 (Call指令 自动操作
栈桢切换 (保存调用者EBP)
4 注意事项
在64位的ubuntu上编译32位的程序需要安装对应的32位的GNU C的库
1
2sudo apt-get install libc6-dev-i386
sudo apt-get install libx32gcc-4.8-devgdb 命令参数
1 | gdb -q # be quite 不输入介绍和版权信息 |