0x01 Simplerop
思路:
32个垃圾数据 + execve(“/bin/sh”, 0, 0)
首先运行一下,让我们输入,输入完成就会退出。
那么我们继续用常用套路
先检查保护,再用IDA看
明显存在栈溢出
用cyclic查到溢出长度是32
并且发现没有system函数以及/bin/sh
那么需要自己构造execve(“/bin/sh”,0,0)
该程序为32位程序,一次最多写入4 bit,那么需要把/bin/sh分两次写入(还需要知道0xb是execve的系统调用号)可以将/bin/sh写入bss段或data段
可以看到都是可读可写的段,我选择了bss段
那么接下来去找gadget,这里用到ROPgadget这个工具去找
找到了这几个gadget,然后这里的逻辑是,先将edx中放入bss段的基址,然后将”/bin”放入eax中,然后再将edx的地址中放入eax的值,相当于C语言中的*edx=eax,”/sh”同理,需要注意的是,”/sh”需要加截断符”\x00”,以及在此之前需要在edx中放入bss的地址加0x4,原理暂时未知。然后需要调用execve的系统调用号并布置参数,最后需要调用系统中断,系统中断后才能发送payload
贴上exp:
1 | from pwn import* |