介绍
这是MCTF的一道题目,貌似是浙警的校赛,不得不吐槽,这个服务器binary和给我们的不一样我是真的服气。(下面会有解释)
格式化字符串漏洞
格式化字符串的漏洞,虽然不常见,但是自己掌握的不咋滴,吐槽的时候顺便记录一下做的过程,不确定是不是非预期解。
ida反编译,很简单的一个四次格式化字符串漏洞,不过基本没有什么函数,也为之后的利用造成了一定困难。
%x %lx %llx
输出栈上的值
%s
任意地址读
%n %hn %hhn
可以任意地址写
$x
选定第几个参数,例如%9$s
读第九个参数所指的值
%?c
?为一个十进制的数,配合%n
使用
Stage 1 leak libc
首先,leak libc地址。读got表中的puts,可以直接算出libc地址。
Stage 2 改got表
然后,修改got表,尝试调用system。但是在这一步,出问题了。因为只有三个函数,read、put、printf,前两个参数不可控。所以打算改printf的,但是只能改一次。因为如果多次改,第二次调用printf直接就是坏的,用不了了。
1 | [*] put_addr: 0x7f4bc464f690 |
我们发现,printf一次不可能改成功,因为必须要用%n改,输出的字符长度为0xc4635800,基本没啥可能。
所以考虑其他方法,想了很久,最后想起来之前有一道题,也是不太好控制参数,所以直接跳到do_system中的一个位置,就会执行system("/bin/sh")
了。
具体位置是在 do_system + 1059,ida见下面。
1 | .text:0000000000045243 call sigaction |
但是,你可能会想到,只能改一次,这个也做不到啊。但是幸运的是,你会发现puts和system的最低两位是一样的,所以只需要四个字节就可以了,这样puts就会被改成system了。接着运行会出现command not found
但是没关系,程序不会crash。再修改一次,修改puts的最低四位,改到do_system里面,这样就可以了。
Stage 3 打远程
打远程,发现收不到字符串,一脸懵逼,怎么就卡在 Hhhh… 这里。仔细一看,我真的是服。
1 | 服务器: is the repeater.Hhhh...\n |
脚本
1 | #!/usr/bin/env python2 |