pwn入门笔记(0)——基础理论

什么是PWN

俚语词,象征着黑客成功入侵,在数据溢出后,向目标发出特定的数据,使其执行我们的恶意代码
eg.永恒之蓝病毒
web的XXS

什么是溢出?

当要表示的数据超出计算机所使用的数据的表示的范围时,则产生数据的溢出
原因
1:使用非类型安全(non-type-safe)C,C++等

C,C++没有进行边界的检查,比如数组,下标越界

2:以不可靠的方式存取或复制内存缓冲区

我们常用的一些函数没有对长度进行限制

3:编译器设置的内存缓冲区太靠近关键数据

栈的缓冲区和里面核心代码段太近了,核心代码容易被覆盖

寄存器知识

PWN常用寄存器:ESP,EBP,EIP
ESP:用来存储函数调用栈的栈顶地址,在压栈和退栈时发生变化
push,pop
EBP:用来存储当前函数状态的基地址,在函数运行不变,可以用来索引确定函数参数或局部变量的位置
EIP:用来存储即将执行指令的地址
IP:16位
EIP(扩展的16位):32位

基础汇编

32位x86架构下汇编指令有两种格式intel与AT&T

intel:寄存器名称和数值前无符号

AT&T:寄存器名称前加“%”,数值前加“$”
在这里插入图片描述
MOV
数据传输指令,将SRC传至DST
格式为:MOV DST ,SRC;

PUSH
压入堆栈指令,将SRC压入栈中,
格式为:PUSH SRC;

POP
弹出堆栈指令,将栈顶数据弹出并存至DST
格式为:POP DST;

add / sub
加减法指令,将计算结果存到DST
格式为:ADD/SUB DST , SRC;

lea
取地址指令,将MEM的地址存入REG
格式为:LEA REG,MEM;

call
调用指令,将当前的eip压入栈顶,并将PTR存入eip
格式为:call ptr;

什么是栈帧?

栈的结构
栈的结构,是从下到上的,栈是从大地址到小地址,越来越小,如果满了的话就溢出了
HIGHT ADDR——>LOW ADDR/栈顶

EBP访问——>局部变量
-4返回局部变量1
-8返回局部变量2
+4返回地址
+8实际参数#1
+12实际参数#2(注:12为16进制)

ESP——>栈顶

栈帧:函数的执行环境
函数参数,函数变量,函数返回到哪里等
每一个栈帧代表一个未运行完的函数

实例:

1

.输入sudo su 使用管理员权限
不是变成这个在这里插入图片描述
是这个
在这里插入图片描述
这样就是root权限了
我们可以看到 $ 变成了 #
PS:有些是要输入密码的,虚拟机输入密码是看不见的,直接输完,Enter就行

几个指令

ls(查看并列出列表)
在这里插入图片描述

cd(进入目录)
在这里插入图片描述

2

.我们可以看到桌面有个文件夹
在这里插入图片描述
在这里插入图片描述
这样我们就可以操作文件夹里面的东东了
在这里插入图片描述
如果里面还有文件夹可以继续使用cd,直到找到你想操作的文件

如何建立一个.c的文件

touch 111.c //111是我瞎取名的

然后我们已经是在这个pwn的文件夹里面了
所以会多出一个111.c的文件
在这里插入图片描述

当然,111感觉不吉利的话我们可以通过下面的指令来删除它

rm -f 111.c

在这里插入图片描述
这样就消失了

3

.接下来用到vi

关于vi编辑器

学习传送门

touch hello.c
vi hello.c

然后进入编辑
在这里插入图片描述
在这里插入图片描述
这个时候表示我们可以修改,按键盘上的insert键或者键盘上面的“i”键也是可以进入修改模式的
按“esc”退出该模式

如何退出vi?
“shift”+";"打出“:”即可进入末行模式(记得之前一定要退出其他模式)
在这里插入图片描述
然后最后一行就会出现这个
然后我们可以通过输入wq来保存退出,q!为强制退出

关于文件提权
我们可以就看到我们新建立的文件上面有个小锁
在这里插入图片描述
再看看权限
在这里插入图片描述
这样的文件是操作不了的
所以我们需要进行提权
输入chmod 777 hello.c
赋予它最高的权限
在这里插入图片描述
然后我们就可以使用它了
在这里插入图片描述
觉得很麻烦的话,还有一种更麻烦的方法,就是在桌面建立一个“文本文档”
拖进ubuntu,改后缀名改成“XXX.c”,之后点进去进行编辑也是可以的【doge】

4

.编译文件
输入gcc -m32 -o test hello.c
进行编译(32是标注32位来编译程序,避免出来是64位,-o是输出)
在这里插入图片描述
error,warning一目了然

5

.用GDB进行反汇编
这里笔者的GDB出了一点问题没办法编译,就暂时贴上别人的图片了,之后我会改回去的
输入disass main
我们的函数是main函数,所以用disass对main进行反汇编
在这里插入图片描述
有哪些指令一目了然
然后disass test
在这里插入图片描述
然后我们可以在主函数下下一个从断点
在这里插入图片描述
输入b *0x080483f6
加星号代表那是一个地址
输入 b text
也是可以断点的
在这里插入图片描述
输入r运行,跑起来
在这里插入图片描述
断点很清晰在这里插入图片描述
push ebp ,把原来的栈保存了一下在这里插入图片描述

n
输入n下一步指令(后面的继续自行输n

在这里插入图片描述
我们可以看到ebp已经被压入栈了在这里插入图片描述
然后
在这里插入图片描述
然后栈顶和ebp重合,以当前esp为基准
继续可见
在这里插入图片描述
之后在这里插入图片描述
esp会往上移动四格
在这里插入图片描述
相当于esp向上申请了一段内存空间
继续
在这里插入图片描述
在这里插入图片描述
1是我们的第一个函数参数
前面图片,有一个c源码的,test(1,2)的1
将参数1进行加八,放到edx里面)
在这里插入图片描述
继续n
同理参数2被放到EAX中
在这里插入图片描述
接下来
在这里插入图片描述
相加保存至EAX
之后EAX变成3
在这里插入图片描述
继续
在这里插入图片描述
将其写到我们之前申请的内存空间中
在这里插入图片描述

EBP -4一般就是申请栈空间
+4一般就是清理堆栈

在这里插入图片描述
继续
在这里插入图片描述
把返回值放到eax里面(一般看到eax代表函数返回值)

leave很少见的一个家伙
不过这么看就行了在这里插入图片描述

在这里插入图片描述
先把ebp放到esp
在这里插入图片描述
即把在这里插入图片描述
esp的这一堆释放掉,使得他们合二为一,让esp指向ebp
之后pop弹栈在这里插入图片描述在这里插入图片描述
很显然是我们main函数的ebp

相当于还原了,这个函数执行前,执行后栈是保持不变的,除了返回值这些,即函数执行完不影响堆栈
继续
在这里插入图片描述
我们可以看到还原了
在这里插入图片描述
我们可以看到此时esp.ebp均指向main函数(其实差不多可以说重合了吧)
继续
在这里插入图片描述
+释放空间
我们可以看到下一步有压栈的操作,所以这一步直接清理了在这里插入图片描述
之后我们栈顶也回到一起了
在这里插入图片描述
之后main函数调用完了,我们清理EAX(赋值为0)EAX
之后差不多就运行完了

删除断点
delete <断点id>

6

.输入start
让程序从最开始跑起来
在这里插入图片描述
继续在这里插入图片描述
在这里插入图片描述
继续在这里插入图片描述
在这里插入图片描述
继续在这里插入图片描述

在这里插入图片描述
继续在这里插入图片描述

在这里插入图片描述
注意在这里插入图片描述
ebp是d548
执行之后我们发现这些几乎都没有变()除了EAX,只是返回了一个结果,对栈堆的影响是没有的在这里插入图片描述
此外补充
si(step会执行到函数内部)
我们在遇到call的时候,需要“步入”,即输‘si’才能知道call里面是什么在这里插入图片描述

关于自定义

1.进入设置
在这里插入图片描述
2.点击keybord(键盘)在这里插入图片描述
3.进入后就可以自定义快捷键了
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值