这篇文章就是来教大家学习怎么动态调试的,然后我还写了一篇关于动态调试的文章,不是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(或者rax)的地址,来计算变量的大小
就像这样
咱直接看后两位相减就行,也就是0xb0-0x30=0x80=128
大小0x80,我们去看看对不对
对的。木的问题
vmmp
使用vmmap直接查看该进程的内存空间,不知道有啥用,晚点问问大神
1.查看栈、bss段是否可以执行,栈溢出包括BSS溢出
方法2(断点的其他方式)没成功
参考
栈溢出学习_loglevel:'debug-CSDN博客
cyclic这个工具,pwntools自带的一个东西
常用的作用有两个:
寻找偏移量(Offset):当你想要利用栈溢出等漏洞时,通常需要知道目标程序中栈上缓冲区的偏移量,以确定准确的覆盖位置。使用"cyclic"工具可以生成一种重复的模式,并将其发送给目标程序,然后在程序崩溃时,通过查找崩溃时覆盖的位置,就能够计算出偏移量。
覆盖返回地址:在进行栈溢出漏洞利用时,通常需要将恶意代码的地址写入到返回地址中,从而实现控制程序流程的目的。使用"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
或者当时直接这样查看
跟着博主没成功,私密马赛,学艺不精