-
-
[分享]栈溢出学习笔记
-
发表于: 2017-12-21 15:31 7402
-
希望得到各位的指教。一是做个总结,二是做个备份。说来惭愧,思路都是7o8v师傅给的。特别感谢7o8v师傅的帮助。
题外:复现蒸米师傅《一步一步学rop》复现失败,猜测是栈的问题,我是调用start恢复栈的做法。这是我看到更为详尽的分析15dK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4m8#2M7Y4m8D9k6i4u0G2j5#2)9J5k6h3y4G2L8g2)9J5c8X3#2V1i4K6u0r3x3U0l9I4y4W2)9J5k6o6l9J5i4K6u0V1x3U0g2Q4y4o6m8f1K9r3W2F1K9$3W2F1k6#2)9J5k6p5q4T1L8%4g2@1i4K6u0V1e0r3g2$3k6h3H3J5i4K6u0W2K9s2c8E0L8l9`.`.
这题是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如下:
这题还是7o8v师傅丢给我的。首先用ida打开,发现有两个洞
惯例checksec一下,发现只开了NX,其实在function函数手动设置了canary
栈上保留了read+35的地址,我们只要%p就可以得到read函数的地址,进而算出system的地址。
这道题目的格式化字符串不是放在栈上而是放在.bss段中。师傅告诉我要用一个跳板,栈上有指针什么是指向栈上的,我第一想到的就是ebp,反正不是打远程机。其实两个字节两个字节写入比较好。好吧,是因为懒。然后我就修改main的ebp使其指向puts函数的got表。使用%n修改got表使其指向sytem函数。这样下次跳用puts("/bin/sh")就变成了system("/bin/sh")。exp如下:
这种做法是7o8v师傅告诉我的,真的是刷新了我对栈溢出的看法。首先爆破出canary的值。然后使用'\x00'使login Success。然后进入leavemsg输入一个'a',而这个'a'刚好覆盖了上面payload 开头的'\x00',实现了任意长度的strcpy。覆盖了function的返回地址。最后sendline('0')引爆这个炸弹。exp如下:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课