pwn1 学习任务

标题 pwn1 学习任务(覆盖返回地址)

1.在虚拟机的终端里打开,如果文件在桌面使用 cd Desktop,后再使用 ls 查看
file guest //查看文件格式 checksec guest //查看保护机制
在这里插入图片描述
可以看出,源程序为 64 位,开启了 NX和ASLR 保护。

在这里插入图片描述

2.将程序拖进64位IDA中查看源码

在这里插入图片描述
找到函数 _main_0 ,然后使用快捷键 F5 反编译显示C伪代码如下:

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

可以看到 buf 这个字符串数组只有0x40的大小,但是却可以 read 0x50个字节,而多出来的就会造成溢出.

在这里插入图片描述
可以知道距离ebp有·0x50个字节,同时把返回地址变成我们想要的返回地址 0x4005ef

3.然后编写脚本exp.py并在 Visual sudio code的 python 中运行

在这里插入图片描述
使用process可以打开一个本地程序并进行交互最后使用gdb调试 看它是否能成功覆盖地址" *0x4005de"
pay也可写为pay = “a”*0x40 + ‘a’*8 +p64(0x4005de)
*这里面搜到一些可以用于读写的函数,主要有:

  • interactive() : 直接进行交互,相当于回到shell的模式,在取得shell之后使用
  • recv(numb = 4096,timeout = default):接收指定字节
  • recvall() : 一直接收知道EOF
  • recvline(keepends = True): 接收一行,keepends为是否保留行尾的\n,默认为Ture
  • recvuntil((delims,drop=False):一直读到delims的pattern出现为止
  • recvrepeat(timeout=default): 持续接收知道EOF或者timeout
  • send(data) :发送数据
  • sendline(data) : 发送一行数据,相当于在数据末尾加\nrecvuntil:接收直到"Now play your game: "这句

结果:
在这里插入图片描述
进行ls查看:在这里插入图片描述
在这里插入图片描述
emmm这一块儿当时有些不太明白…
应该是压栈吧… 大概解释一下:一个程序的动态数据通过一块叫做堆栈的区域来存放。堆栈处于内存的高端,它有个特
性:后进先出。当程序中调用子函数时,计算机首先把参数依次压入堆栈,然后把指令寄存器(EIP)中的内容做为返回地址(RET)压入堆栈,第三个压入堆栈的是基址寄存器(EBP),然后把当前的栈顶指针(ESP)拷贝到EBP,做为新的基地址。最后把ESP减去一定的数值,用来为本地变量留出一定空间。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.最后进行gdb调试,调试c继续运行
在这里插入图片描述在这里插入图片描述
发现断点断在了0x4005e8,可以看出覆盖成功
在这里插入图片描述
最后看见返回地址被成功覆盖成0x4005de则执行完毕

下面整理一些知识点:
gdb常用命令:gbd+文件名 静态调试 ,gdb attach +文件名 动态调试

  • 常用命令:
  1. checksec 查看elf编译的保护选项。
  2. file [file] 加载objfile
  3. disas addr 对地址addr处的指令进行反汇编,addr可以是函数名
  4. b *addr 在addr处下一个断点
  5. x addr 查看addr处存储的数据值
  6. r 运行被调试的程序
  7. c 继续运行
  8. ni 单步执行不进入
  9. si 单步执行并进入
  10. vmmap 得到虚拟映射地址

aslr – 显示/设定GDB的ASLR(地址空间配置随机加载)设置

checksec – 检查二进制文件的各种安全选项

dumpargs – 函数将要被调用时,显示将要被传入函数的所有参数(默认会在反汇编代码下方自动显示)

dumprop – 在给定内存范围中Dump出所有ROP gadgets

pattern – 生成字符串模板 写入内存 用于定位溢出点
(pattern create size 生成特定长度字符串;pattern offset value 定位字符串)

elfsymbol – 获取non-debugging symbol信息(plt表)

readelf – 获取elf头信息

  • gdb调试的作用:
    1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
    2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
    3、当程序被停住时,可以检查此时你的程序中所发生的事。
    4、动态的改变你程序的执行环境。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值