攻防世界-实时数据监测(排除错误想法后得到答案)

32位程序,保护全没开??

打开直接进入要分析的函数

fgets读入512个字节,保存在s,然后s作为参数进入imagemagic函数中

格式化字符串漏洞,嘿嘿
之后是一个判断,如果key等于35795746时我们可以取得控制权
开搞!
确定一下偏移

是12
1.普通修改?
想直接用 "%035795742d" 修改key。但是很遗憾

但是很遗憾一直冒0,我也不知道为啥(没开车!)
更:破案了,原来是运行中

要注意那个改写的数字要减4,因为前面写入key的地址用了4字节
2小端修改
变量在内存中都是以字节的格式存储的,在 x86、x64 中是按照小端存储的,格式化字符串里面有两个标志用的上了:
h:对于整数类型,printf 期待一个从 short 提升的 int 尺寸的整型参数
hh:对于整型类型,printf 期待一个从 char 提升的 int 尺寸的整形参数
意思是说:hhn 写入的就是单字节,hn 写入的就是双字节。

所以我们的payload可以确定为:
payload=p32(0x0804A048)+p32(0x0804A049)+p32(0x0804A04a)+p32(0x0804A04b)+pad1+’%12 h h n ′ + p a d 2 + ′ hhn'+pad2+'%13 hhn′+pad2+′hhn’+pad3+’%14$hhn’+pad4+’%15 $hhn’
3.骚操作
fmtstr_payload是pwntools里面的一个工具,用来简化对格式化字符串漏洞的构造工作
fmtstr_payload(offset, writes, numbwritten=0, write_size='byte')
第一个参数表示格式化字符串的偏移;
第二个参数表示需要利用%n写入的数据,采用字典形式,我们要将printf的GOT数据改为system函数地址,就写成{printfGOT: systemAddress};本题是将0804a048处改为0x2223322
第三个参数表示已经输出的字符个数,这里没有,为0,采用默认值即可;
第四个参数表示写入方式,是按字节(byte)、按双字节(short)还是按四字节(int),对应着hhn、hn和n,默认值是byte,即按hhn写。
fmtstr_payload函数返回的就是payload

实际上我们常用的形式是fmtstr_payload(offset,{address1:value1}),对于第一个参数是offest(偏移),后面是地址,和地址中写入的值。

这道题网上的exp都是格式化字符串做出的,这也是本题唯一正确答案。其实一开始拿到这个题目我是想直接栈溢出的,结果发现溢出长度不够(只有8个字节,只能覆盖ebp和返回地址),故想到栈迁移,但是还是很遗憾,因为没有可以泄露ebp地址的函数,无法构造,所以就只剩下一种辽,也就是师傅们的做法

posted @ 2022-04-17 23:11  -ro0t  阅读(51)  评论(0)    收藏  举报