PWN动态调试1.1版

这篇文章就是来教大家学习怎么动态调试的,然后我还写了一篇关于动态调试的文章,不是buu上面的题,就是两道简单的栈溢出问题,那两道题挺有特点的。大家可以去看看。

每日3道PWN之课外2道(第2.5天)-CSDN博客

先找一个简单的jarvisoj_level0调试一下,然后咱再看复杂的pwn1_sctf_2016

听说又不考pwn了,所以只写完了jarvisoj_level0,现在我就转行去学逆向了

so,停工了~~~私密马赛!

要求环境gdb和pwotool+pwndbg

jarvisoj_level0

先回忆一下

进去后按f5,查看反编译的代码

看一下vulnerable_function这个函数

找后门shift+f12

双击跟进

记录地址0x40059A

大概回忆起来了吧,就是read溢出,做题思路我的另一个博客写过,大家可以去看,

每日3道PWN(第二天)-CSDN博客


动态调试

现在我们进行动态调试

动态分析的正常流程,gdb打开文件

查看变量大小的两种方法

方法1(常规大main的断点+老老实实的查看)

b main 设置断点

阿这,他说我权限不够,稍等我一下哈,先chmod +x level0一下

然后再来一遍,run一下,我们就能看见main函数的汇编和栈什么的

下面这张不是本题的图,但是有结构大概解释

注意:asm的英文就是汇编的意思,registers是寄存器的意思,stack是栈的意思

看见漏洞函数了,为什么知道他是漏洞函数,当然因为前面我都博客里IDA静态分析过了~

而且这个函数的中文意思就是易受攻击的函数

我们就一直输入n,然后知道绿色的箭头指到漏洞函数vulnerable_function

按s,s就是step,si单步步进,进入该函数里面,看见了吧,漏洞利用点,read函数

tips:fini是退出当前函数,r是重新运行,如果弄错的,可以试试这两个

stack 24 命令查看当前栈的前24个栈帧

为什么要stack 24呢

我们的目的,就是查看当前变量buf的大小,前提就是要进入该函数内,就是n一直下一步,直到指向函数之后,输入s,单步进入函数,才能看见变量buf。所以要stack

然后为什么24,听我的大佬说,不管输入几,目的只要看见ebp或者rbp就算可以了,然后我们就用ebp(或者rbp)的地址减去eax(或者rsi)的地址,来计算变量的大小

这里是rbp的0x7fffffffdfb0减去rsi的0x7fffffffdf30

就像这样

咱直接看后两位相减就行,也就是0xb0-0x30=0x80=128

大小0x80,我们去看看对不对

对的。木的问题

vmmp

使用vmmap直接查看该进程的内存空间,不知道有啥用,晚点问问大神

他说,主要就是用来看执行权限的,看rwxp这个权限的,看有没有ASRL漏洞或者其他的


方法2(断点的其他方式)没成功

参考

栈溢出学习_loglevel:'debug-CSDN博客

cyclic这个工具,pwntools自带的一个东西

常用的作用有两个:

  1. 寻找偏移量(Offset):当你想要利用栈溢出等漏洞时,通常需要知道目标程序中栈上缓冲区的偏移量,以确定准确的覆盖位置。使用"cyclic"工具可以生成一种重复的模式,并将其发送给目标程序,然后在程序崩溃时,通过查找崩溃时覆盖的位置,就能够计算出偏移量。

  2. 覆盖返回地址:在进行栈溢出漏洞利用时,通常需要将恶意代码的地址写入到返回地址中,从而实现控制程序流程的目的。使用"cyclic"工具可以生成指定长度的重复模式,并将其作为返回地址,使程序跳转到我们控制的位置。

寻找偏移量,以下是实例代码:

from pwn import *

pattern = cyclic(100)  # 生成长度为100的重复模式,就相当于b'A'*n
print(pattern)

# 在漏洞利用中发送模式给目标程序
p = process('./vulnerable_program')
p.sendline(pattern)
p.recv()  //接受数据的意思,就是有时候他会有一个提示的字符串,需要你先进性接收
p.close() //关闭接受的意思

# 漏洞触发后,获取返回地址所在的偏移量
offset = cyclic_find(packed_address)  # packed_address为返回地址
print(offset)

然后我要讲的是gdb中cyclic的使用,目标是0x80=128,可以多一点,进行溢出,也可以刚刚好等于128

这里生成128位垃圾数据,一会直接拿来复制粘贴

这次也再学习以下打断点的其他方式

先去IDA中查找漏洞利用函数的地址,我们打地址的断点

先找到漏洞利用的read函数

然后右键选择copy to assembly(复制到程序集的意思,咱也不知道程序集是啥意思,但作用把每一行源代码就是编译成成汇编码,并进行注释说明)

call的汇编码意思是函数的意思,后面还有read字样

那就是他了,记一下地址0x4005bf

gdb打断点去

tip:对了,断点就是让程序运行道某给位置后停止,然后一步一步进行,是为了让程序员调试用的

打断点b *地址,别忘了*

然后我们在n的时候,就直接让我们输入东西了

找到栈,找道地址0x7fffffffdf30

然后用cyclic

或者当时直接这样查看

跟着博主没成功,私密马赛,学艺不精

pwn1_sctf_2016(未整理)

猜你喜欢

转载自blog.csdn.net/m0_71274136/article/details/134831752
pwn