[PWN][基础篇]基础理论

简介: [PWN][基础篇]基础理论

[PWN][基础篇]基础理论

1、相关知识

2、栈帧

3、实例教学


1、相关知识

溢出概念:在计算机中,当要表示的数据超出计算机所使用的的数据表示范围时,产生了数据的溢出


产生的原因:

1、使用了非类型安全的语言 比如C和C++

2、用不可靠的方式存取或者复制内存缓存区

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


PWN的概念:“呯!!!”

指的是攻破设备或者系统。


PWN常用的寄存器,ESP,EBP,EIP

ESP:栈顶指针,在push和pop时会有变化

EBP:栈底指针,用来索引确定函数参数或者局部变量的位置(经常访问局部变量)

EIP:用来存储即将执行的程序指令的地址

image.png

常用汇编指令

mov

pop 弹栈

add/sub 加减

push 压栈

lea 取地址

call 调用函数

2、栈帧

image.png

从下向上,大地址到小地址

栈帧就是一个函数的执行环境

函数参数、函数的局部变脸、函数执行完后返回到哪里等等

每一个栈帧代表的就是一个未运行完的函数

3、实例教学

代码如下

image.png

创建过程如下:

1、创建一个

touch hello.c

2、添加可以正确执行的C文件

vim hello.c (vim的使用教学,建议大家通过菜鸟教程进行学习)

3、提权

chmod 77 hello.c

4、编译c文件

gcc -m32 -o hello hello.c

或者是

gcc hello.c -0 hello

gcc -Wall -g -o hello hello.c

注意:

-Wall 代表编译器在编译过程中会输出警告信息(Warning),比如有些变量你并没有使用,指针指向的类型有误,main 函数没有返回整数值等。这类信息虽然不是错误,不影响编译,但是很可能是程序 bug 的源头,也有助于你寻找代码中的错误,规范代码格式。所以建议每次编译时都加上 -Wall 参数。


-g 代表编译器会收集调试(debug)信息,这样如果你的程序运行出错,就可以通过 gdb 或者 lldb 等工具进行逐行调试,方便找出错误原因。如果你不是百分之百确定你的程序毫无问题,建议加上 -g 参数。这样 debug 的时候会方便很多。


-o 代表编译器会将编译完成后的可执行文件以你指定的名称输出到你指定的文件夹下。-o 的空格后的名称就是输出的文件的名称。例如我这里 -o 后是 test,就是说 gcc 会在编译成功后在我的当前目录下生成一个叫 test 的可执行文件。如果不加这个参数,每次编译后生成的可执行文件都会放在根目录下,名字叫做 a.out。每次编译成功后都会把上一次的 a.out 文件覆盖。所以建议加上 -o 参数,这样可以更加条理。


-m32:编译32位程序

接下来我们就可以使用gdb进行调试了

首先我们先来看看主函数main的反汇编代码

disass main

image.png

我们再来看看test函数

disass test

接下来,我们要分析传参情况,所以我们在test函数口下一个断点

b *0x080483f6

或者是

b test

下断点成功之后,如下图

image.png

运行程序

r

1.png

之后我们就要单步跟踪n,仔细体会传参的过程,esp和ebp变化的过程,来理解堆栈的意义。


一些gdb的指令:


  1. 运行

r是运行


n是单步执行,next遇到函数不会进入函数内部


si是步入,step会执行到函数内部


c是继续运行,调试时,使用continue命令继续执行程序。程序遇到断电后再次暂停执行;如果没有断点,就会一直执行到结束。


  1. 删除断点

删除断点通过命令包括:


delete <断点id>:删除指定断点


delete:删除所有断点


clear


clear 函数名


clear 行号


clear 文件名:行号


clear 文件名:函数名


  1. 查看断点

info br


简写:i b


  1. 设置断点

设置断点可以通过b或者break设置断点,断点的设置可以通过函数名、行号、文件名+函数名、文件名+行号以及偏移量、地址等进行设置。


break 函数名


break 行号


break 文件名:函数名


break 文件名:行号


break +偏移量


break -偏移量


break *地址


希望大家有所收获!!!


相关文章
|
6月前
|
安全 Cloud Native Go
猫头虎博主赠书二期:《Go黑帽子 渗透测试编程之道(安全技术经典译丛) 》
猫头虎博主赠书二期:《Go黑帽子 渗透测试编程之道(安全技术经典译丛) 》
50 0
|
6月前
|
分布式计算 安全 网络协议
【大学计算机技术】第七章 测试 4
【大学计算机技术】第七章 测试
97 0
|
8月前
|
算法
算法强化每日一题--组队竞赛
算法强化每日一题--组队竞赛
[PWN][补充篇]pwntools的相关知识
[PWN][补充篇]pwntools的相关知识
129 0
|
机器学习/深度学习 自然语言处理 算法
TPAMI 2021 | 清华大学朱文武团队:首篇课程学习综述
来自清华大学的研究者王鑫、陈禹东、朱文武撰写了一篇名为《A Survey on Curriculum Learning》的课程学习综述论文,该论文已被TPAMI 2021收录,本文对其展开介绍。
368 0
TPAMI 2021 | 清华大学朱文武团队:首篇课程学习综述
DayDayUp:本博主预计2019下半年将会出两本书(关于人工智能算法及其实战案例应用方向、计算机算法竞赛集锦方向),如有合作意向,请留言告知
DayDayUp:本博主预计2019下半年将会出两本书(关于人工智能算法及其实战案例应用方向、计算机算法竞赛集锦方向),如有合作意向,请留言告知
DayDayUp:本博主预计2019下半年将会出两本书(关于人工智能算法及其实战案例应用方向、计算机算法竞赛集锦方向),如有合作意向,请留言告知
|
Android开发 iOS开发 开发者
“.NET研究”移动开发者生态实录:在失败与成功的天平上
  移动开发者当然不是这两年才出现的角色,但是个人开发者和小型团队开发者通过开发应用程序盈利却是在最近两年移动互联网尘嚣日上之后才出现的。在靠卖License作为主要盈利模式的传统“大”软件行业,不管中小型开发者如何优秀,都不太可能在与微软、Sun、CA等大型软件公司的较量中赢得胜算。
1295 0
|
算法 C++ 人工智能
NOIP-C++大神培养计划Step1.1.1基础算法——模拟算法1
模拟算法,可以说是最基础的算法了。它的基本定义没太多意思:就是去模拟题目的要求。题意要你怎么做,你就怎么做,看懂了题目,基本上就会做了。 举一个大家耳熟能详的栗子。 A+B Problem给定两个整数A和B,输出他们的和。
1766 0
|
算法
NOIP-C++大神培养计划 Step1.1.2基础算法——模拟算法2
大家好,我是小笨笨,今天我们继续来讲解模拟算法。 我们直接上例题! 栗1.1.2-1 洛谷P1014 Cantor表https://www.luogu.org/problemnew/show/P1014题目描述现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。
1304 0
|
机器学习/深度学习 人工智能 算法
MIT数亿美金构建MIT IQ 项目,逆向工程人类智能打造可自我发育的计算机
MIT发起MIT IQ项目,旨在联合多个学科,对人类智能进行逆向工程,为机器学习和人工智能创造新的算法,并促进协作,共同推动AI的突破。该项目包含“核心”和“桥梁”两个实体,分别注重基础研究和应用研究。该项目或能促进学术界与工业界、AI学科与其他学科为实现AI突破的更多合作。
2287 0