1、ret2blic
1、何为ret2blic
通过返回地址或者函数的plt跳到我们需要执行的函数,从而达到我们想要的,一般都是得到shell
2、源码
|
|
运行命令生成gcc -m32 -no-pie -fno-stack-protector -z execstack -o pwn1 pwn1.c
3、漏洞原理,利用ret2blic技术
ida打开,查看grant函数 汇编代码如下
这里可以理解为system(command)
最后ret,将保存的 函数返回地址从堆栈的顶部pop出值到EIP。
而我们想要得到shell,就得将command改为“bin/sh”,即system("bin/sh")
从ida我们看到“/bin/sh”的地址0x8048610
从ida我们看到system_plt的地址0x8048390
我们构造一个“假”的堆栈结构,然后修改函数的返回地址:
payload='a'*28+p32(system_plt)+p32(1)+p32(sh_addr)
p32(system_plt):原函数的返回地址,这里改为我们要执行的system的地址
p32(1):system的返回地址,因为用不到,这里我随便填的。
p32(sh_addr):system的第一个参数,要执行字符串的地址,我们要拿到shell,就填’/bin/sh’的地址
4、exp
|
|
记录一下字节走的坑:
后面发现system_plt等等许多plt是不能用ida看到出来的,上面也许是巧合
要写会用system_plt=elf.symbols[‘system’]
5、改善的exp
|
|
2、整数溢出
1、整数溢出
整数溢出就是往存储整数的内存单位存放的数据大于该内存单位所能存储的最大值,整数溢出有时候间接导致缓冲区溢出。
2、题目-全球某工商的ctf网站上的ctf题(还有源码福利)
题目:
链接:http://pan.baidu.com/s/1nuU9pO1 密码:e7ue
3、分析
先file pwn0,发现为32位,checksec pwn0并且没有开NX,用ida打开,如下
发现栈空间为14h,这里是无符号接受判断输入的字符个数,也就是当超过256,个字符又会循环。即257为1,根据题目
判断输入字符4~8个,即261=5,构造261位,既可以绕过检测,又为我们提供了栈空间
由于已经知道那个函数的栈空间14h,那么函数的返回地址即为18h,但是我们的shellcode是大于18h的,所以放在18h的后面,payload如下:
payload ='a'*24 + ret + shellcode
现在我们找到ret的地址,即是shellcode的起始地址(shellcode可以自己生成),这我…一言难尽
调试,找到shellcode的起始地址
改变返回地址
ret = 0xffffcf80
运行
成功!
然而,并没有做过pwn题的我来说,我就直接运行,悲剧发生了
原来要在本地跑运行,然后 核心转存,用生成的coredump来调试
核心转存配置:
这几个指令。执行完后我们就关掉整个linux系统的ASLR保护。
本地运行:
socat tcp-l:4000,fork exec:./pwn0
本地生成core.pwn0.2684文件,调试core.pwn0.2684文件
gdb pwn0 core.pwn0.2684
如图:
本地测试运行成功,连上目标机器,就不能成功,可能是libc.so.6不同
exp:
这里我先用一个循环脚本写找到那个shellcode的地址,在代入
exp: