[Black Watch 入群题]PWN
ciscn_2019_es_2
特别注意,在第二次做题发现泄露ebp地址为什么与填充大小不同,经过gdb调试后发现,当填充到ebp是,ebp里面的值恰好是ebp的地址减0x10属于偶然情况,要注意使用gdb调试,还有一点在填写system的参数binsh是填入的是地址由于我们写入的binsh与s的初始举例为4的地址差,所以buf-0x38+0x4*3。
具体的过程网上都有太多了,仅在这里记录一下我自己的感想与想法,
1.栈迁移题目其实最重要的是理解esp.ebp栈顶栈底指针的变化,leave-ret指令的调用指针很重要,其次是调用两次leave之后,栈迁移的fake地址一定是要减去4,是因为有一次ebp指令没有用处。
2.栈迁移题目中,分两个大类一种是栈迁移至bss段,还有一种便是迁移到可输入位置之前的地址,第一种迁移至bss段,有着固定格式,直接垃圾填充+ebp填入迁移地址+gadget-leave-ret,便可迁移至我们想要的bss段,第二种有printf语句但无bss段就可以先垃圾填充至ebp再输出ebp的地址,找偏移构造rop
3.还有一点非常重要的当迁移以后地址的第一位为函数调用时,会执行pop eip所以迁移地址要减0x4。
相关文章感谢
栈迁移进阶
HITCON-Training-lab6
先放上解析和地址
https://github.com/scwuaptx/HITCON-Training
[栈迁移]stackoverflow:HITCON-Training LAB6_漫小牛的博客-CSDN博客
解决这类栈迁移最最重要的便是理解bp和sp是如何由leave_ret利用来进行变化的,
记录几个重点,read函数的参数输入(标准输入,地址,大小),之后跳一个地址进行read的输入
context的应用来找到recv的put_addr接受多少。最最最重要的还是感谢学长的指点。实践调程序才是基础重中之重。