PWN任务(二)

攻防世界String.
首先是检查
在这里插入图片描述
可以看到开启了三重保护,是个64位ELF文件。把它放进IDA里反编译看看。
在这里插入图片描述
这是主函数,点开它调用的函数会发现这些函数都是一层一层的在调用
在这里插入图片描述
具体的都是以上以sub开头的函数,然后我们一个一个函数分析发现在sub_400BB9中有一个格式化字符串漏洞在这里插入图片描述
但不知道有什么用,于是继续往后看可以发现在函数sub_400CA6中,有命令执行的语句,可以直接执行外部输入的命令。
在这里插入图片描述
这意味着我们可以让这个语句执行我们的shellcode,然后获取flag.思路就逐渐清晰了,利用格式化字符串漏洞让程序的控制流进入到命令执行语句,从而拿到flag。而执行这段代码的条件首先是要让a1==a1[1],追根溯源,发现a来源于main函数中的v4,v4是强制转换位int64后的v3,*v3是68,v3[1]是85,我们可以利用格式化字符串漏洞让它俩相等。此处要注意64位的程序中前6个参数是存在寄存器中的,从第7个参数开始才会出现在栈中,所以栈中从格式化串开始的第一个,应该是%7 $n。于是可以开始写exp。而最后要返回的地址在一开始的main函数中通过secret[0]给了我们。
在这里插入图片描述
最后的EXP如上图。

观看视频笔记。
格式化字符串漏洞
原理:printf函数在执行时,首先进行格式化字符串的解析——从栈(或者寄存器)获取参数并与符号说明进行匹配,然后将匹配的结果输出到屏幕上。那么,如果格式化字符串中的符号声明与栈上参数不能正确匹配,比如参数个数少于符号声明个数时,就有可能造成泄露。
作用:泄露内存,覆盖内存
1.由于格式化字符串变长参数的特性,在实际运行中,如果Format String的符号说明个数超过待匹配的参数个数,即有更多的符号说明需要被匹配时,printf会根据解析结果和调用约定去取栈上(reg)相应的值并输出。
2.当我们不向printf提供更多参数时,printf会打出栈上本不应该被访问到信息,我们能够通过这种方式获取到很多有用的信息,例如通过泄露的栈变量计算参数偏移量、通过栈上的信息计算程序基地址以及libc基地址等。
3.构造payload,在格式化字符串中包含想要写入的地址,此时该地址会随格式化字符串放在栈上,然后用格式化字符串的’%K$n’来实现写功能。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值