Featured image of post PWN! PWN! PANG! Part1---基础知识

PWN! PWN! PANG! Part1---基础知识

PWN? PWN!

PWN! PWN! PANG! Part1

前言

这里是PGR的PWN基础学习笔记qaq,主要研究的是Linux下ELF可执行文件的漏洞利用

涉及内容:

  • 栈(Stack)的漏洞利用,主要是栈溢出(Stack Overflow)攻击

PS: 说到Stack Overflow就必须得说一个同名的国外著名IT论坛(真的特别特别特别好用)

重要的事情说三遍哈XD

https://stackoverflow.com/

  • C语言Printf()函数格式化字符串漏洞(Format String)

  • 一小点堆(Heap)利用


AND: 文章中涉及的题目文件会全部随文章发出来

如果各位不想一个一个下载的话,这边有一个环境搭好(工具+题目)的Xubuntu Linux(VMware虚拟机)

链接如下:

mimiksworkshop-my.sharepoint.com/:u:/g/personal/kirapgr_mimiksworkshop_onmicrosoft_com/Efyh9fLtgIZCi2Q21hCXLI0BFrHp17qc9ZxHW6mjovmSBw?e=BUtZzA

如果想只下载题目的话:

mimiksworkshop-my.sharepoint.com/:u:/g/personal/kirapgr_mimiksworkshop_onmicrosoft_com/Eefb6Yqp7vpGriwwFz6wQCkBtjqcFnGZwZTAyK2fJhA_FA?e=gjHVUW

什么是PWN?

PWN原指黑客攻破系统发出的“砰”的响声,在这里我们解释为二进制漏洞挖掘与利用

分步来讲的话 = = 大概可以概括为以下几点:

  • 破解、利用成功(程序的二进制漏洞)

  • 攻破(设备、服务器)

  • 控制(设备、服务器)

配个图

Linux下ELF文件

ELF文件的是Linux下的可执行文件,与Windows下exe文件不同

可以用File命令查看你的文件格式:

File命令

不过这里有一个很有趣的地方,由于File命令依据文件头判断文件类型,Linux的后缀名并不影响File命令判断文件是ELF文件(即使a.out已经变成了a.zip)

不过在文件夹窗口里双击这个.zip, 就会发现:这个ELF文件已经被当成压缩包打开 (这和win似乎很像)

可见在修改后缀名的过程中,干扰了系统对于文件打开方式的识别= =

嘿嘿= =, 被迷惑了呢;)

ELF文件的结构

咳咳,貌似扯远了= =

ELF文件结构

现在我们再重新审视一下"a.out"这个可执行文件

我们刚刚一不小心把它用压缩包的方式打开(如上图)

我们看到一堆奇怪的文件:

  • .got

  • .got.plt

  • .plt

  • .text

这些文件实际上代表着这个ELF文件在磁盘里的 一个个 “节”(Section)

而当ELF被映射进内存中的时候, 就有了段(Segment)

节与段

段与节

在这里再详细扯一点段与节的东西

(嘛 = =, 因为我个人学的时候感觉这块知识对于后面影响挺大的)

先扯一下: 段是比节大的qaq

这里来一个非常非常经典且重要的图,有请:

非常非常经典且重要的图 PS: 还是QQ截图清楚  别打了别打了)

从这张图我们可以看到,.data .bss .got.plt节都被映射到了Data(数据)段

而.rodata .text .init ELF Header被映射到了Code(代码)段

这是为什么呢?

  • 前三个节 (懒得仔细写了) 有一个共同的特征:可读可写。因为用户数据是要保存在这里的,如果它不可写的话,显然不彳亍= = 。 很显然,你也不能让它可执行,这样用户就可以写入任意数据并执行了(永远不要相信用户的输入是安全的)

  • 后四个节是代码部分,往往是小程序自己的一些东西,所以他是可读可执行,但不可以写= =

  • 最后, >__<, 再来个图;)

    有关部分节的作用

程序数据在内存中的组织

废话不说,直接上图()

程序数据在内存中的组织

咳咳,在这里默认大家有一点的c基础

不再扯开讲了

这里要注意的几点就是

  • 栈是向下从高地址向低地址增长的

  • 堆是从低地址向高地址增长

  • 数据是从低地址向高地址写入

  • BSS保存全局变量

  • 栈保存局部变量

关于汇编,罪恶的汇编= =

汇编的话,只需要知道最最最基础的一些指令= =

既然都写了这么长了嘛= =

那就继续下去好了。。咳咳。

一些常用汇编指令

常用汇编指令

用法

MOV DEST(地址), SRC()      ; 把源操作数传送给目标(类似赋值语句)
LEA REG, SRC            ; 把源操作数的有效地址送给指定的寄存器(把SRC的地址保存到…)
PUSH VALUE                 ; 把目标值压栈,同时SP指针-1字长
POP DEST                     ; 将栈顶的值弹出至目的存储位置,同时SP指针+1字长
LEAVE       ; 在函数返回时,恢复父函数栈帧的指令(子函数调用结束后,销毁子函数栈帧)
RET                      ; 在函数返回时,控制程序执行流返回父函数的指令

结语

(啊,终于写完了, 好累)

花了四五个小时才搞完= =

不过嘛,能复习前面的知识并且能与大家分享.qaq.

还是挺有趣的嘛= =


To Be Continued….

Licensed under CC BY-NC-SA 4.0
For a better open source community!
Built with Hugo
主题 StackJimmy 设计