题目链接如下:
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 一下,堆栈可执行。
我就想 ret
到 jmp esp
这条指令上,然后在 ret
之后放置 shellcode。结果,不够长,gg
7o8v 师傅告诉我的思路 ( frame faking ),ret
到 jmp esp
指令上,这样就跳到栈上,再在栈上布置合适的 sub esp
,再 jmp esp
我失败的思路是在寄存器上找合适或相近的数据,再修改一下寄存器,用 jmp
寄存器。然后没有合适的 gadget
。
后面我就想通过 ret
到 printf
泄露出栈地址,再 ret
到 mian
。这样就可以计算出栈地址。
因为输入长度限制,跪了,exp 如下:
0x02 pwn2
这题还是 7o8v 师傅丢给我的。首先用 ida
打开,发现有两个洞
惯例 checksec
一下,发现只开了 NX
,其实在 function
函数手动设置了 canary
格式化字符串来做
栈上保留了 read+35
的地址,我们只要 %p
就可以得到 read
函数的地址,进而算出 system
的地址。
这道题目的格式化字符串不是放在栈上而是放在 .bss
段中。
大佬告诉我要用一个跳板,栈上有指针什么是指向栈上的,我第一想到的就是 ebp
,反正不是打远程机。
其实两个两个字节写入比较好。好吧,是因为懒。然后我就修改 main
的 ebp
使其指向 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