栈溢出学习笔记

2017-12-13 19:32:44 ABC 信安之路

题目链接如下:

https://pan.baidu.com/s/1mhVvanY 密码: bwsn

一是做个总结,二是做个备份。说来惭愧,思路都是 7o8v 师傅给的。特别感谢 7o8v 师傅的帮助。

题外:复现蒸米师傅 《一步一步学 rop》 复现失败,猜测是栈的问题,我是调用 start 恢复栈的做法。

这是我看到更为详尽的分析

http://www.purpleroc.com/md/2016-02-25@Thinking-About-Level2.html

0x01 pwn1

这题是 7o8v 师傅丢给我的。特别的就是这题是静态链接。所以,got 覆写就 gg 了。因为有源码就直接 checksec 一下,堆栈可执行。

我就想 retjmp esp 这条指令上,然后在 ret 之后放置 shellcode。结果,不够长,gg

7o8v 师傅告诉我的思路 ( frame faking ),retjmp esp 指令上,这样就跳到栈上,再在栈上布置合适的 sub esp,再 jmp esp

我失败的思路是在寄存器上找合适或相近的数据,再修改一下寄存器,用 jmp 寄存器。然后没有合适的 gadget

后面我就想通过 retprintf 泄露出栈地址,再 retmian。这样就可以计算出栈地址。

因为输入长度限制,跪了,exp 如下:


0x02 pwn2

这题还是 7o8v 师傅丢给我的。首先用 ida 打开,发现有两个洞


惯例 checksec 一下,发现只开了 NX,其实在 function 函数手动设置了 canary

格式化字符串来做

栈上保留了 read+35 的地址,我们只要 %p 就可以得到 read 函数的地址,进而算出 system 的地址。

这道题目的格式化字符串不是放在栈上而是放在 .bss 段中。

大佬告诉我要用一个跳板,栈上有指针什么是指向栈上的,我第一想到的就是 ebp ,反正不是打远程机。

其实两个两个字节写入比较好。好吧,是因为懒。然后我就修改 mainebp 使其指向 puts 函数的 got 表。使用 %n 修改 got 表使其指向 system 函数。这样下次跳用 puts("/bin/sh") 就变成了 system("/bin/sh")

exp 如下:

栈溢出

这种做法是 7o8v 师傅告诉我的,真的是刷新了我对栈溢出的看法。

首先爆破出 canary 的值。然后使用 '\x00' 使 login Success。

然后进入 leavemsg 输入一个 'a',而这个 'a' 刚好覆盖了上面 payload 开头的 '\x00', 实现了任意长度的 strcpy

覆盖了 function 的返回地址。最后 sendline('0') 引爆这个炸弹。

exp如下:


0x03 总结

1、 对知识点的理解不够深刻,花了一个月的时间尝试溢出 scanf("%d"),尝试使用格式化字符串漏洞修改 eip [笑哭]

2、 从 7o8v 师傅的 exp 中了解到栈溢出并不是只在输入发生的

3、 台上一分钟,台下十年功

0x04 参考资料

http://bobao.360.cn/learning/detail/3654.html

https://bbs.pediy.com/thread-213067.htm