-
-
[原创]2017 湖湘杯pwn200 格式化字符串
-
发表于:
2018-2-12 23:49
13722
-
[原创]2017 湖湘杯pwn200 格式化字符串
这篇在FreeBuf发过了,不过那边快两个周没联系我发稿费……就把之前写的几篇pwn入门文章都发到看雪好了~希望为论坛做一点点贡献。
https://github.com/eternalsakura/ctf_pwn/tree/master/湖湘杯2017/pwn200
形如
找到格式化字符串漏洞
tips1
查看本机ASLR
so地址变动,确定本机开启了aslr
关闭ASLR
echo 0 > /proc/sys/kernel/randomize_va_space
确认关闭
看到printf(&buf)之后
read(buf)
atoi(buf)
所以我们的思路就是,利用格式化字符串漏洞的任意地址读,先leak出puts函数的地址puts_addr
到利用格式化字符串漏洞的任意地址写,去将atoi函数在got.plt表中的地址改为system函数的地址,然后通过read去控制buf,传入"/bin/sh",构造出system("bin/sh"),获取shell。
关于覆盖got表,不知道为什么的话,参考下面的文章。
https://www.jianshu.com/p/0ac63c3744dd
http://rickgray.me/use-gdb-to-study-got-and-plt
任意地址读:https://ctf-wiki.github.io/ctf-wiki/pwn/fmtstr/fmtstr_exploit.html
调试找到puts的地址在栈中的位置。
在gdb中调试(这里我使用了gef插件),可以看出地址在7个参数(仔细分析一下AAAA%7$x
,把AAAA换掉就是地址,把%x换成%s就可以打印出内容)
libc.symbols['system'] - libc.symbols['puts'] + u32(puts_addr)
输出为
abcabc
val = 3
这就告诉我们,%n可以把其前面输出的字符个数,写入&val指向的地址。
如果还不理解的话可以参考:
https://ctf-wiki.github.io/ctf-wiki/pwn/fmtstr/fmtstr_exploit.html
http://www.cnblogs.com/Ox9A82/p/5429099.html
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-1-28 13:13
被admin编辑
,原因: