8月7日pwn学习
题目:hello_pwn
题目描述:pwn!,segment fault!菜鸡陷入了沉思
解题思路:老规矩按步骤办事
1.checksec文件
没有stack保护,也没有内存地址随机机制
2.file查看文件信息
3.尝试连接
4.ida逆编译文件
main伪代码
发现如果dword——60106c这个值为1853186401这个值,便可以得到flag
内存地址栈
发现unk_601068这个值可以溢出到doword上。
5.写exp
6.得到结果
题目:level2
题目描述:菜鸡请教大神如何获得flag,大神告诉他‘使用`面向返回的编程`(ROP)就可以了’
题目分析:在ida的时候遇到了麻烦,因为32位版本的ida又没有编译器,所以只得重找资源,下好了再按常规步骤进行。除此之外还需要对函数栈进行一个学习。
函数栈
学习博客为:https://blog.csdn.net/u012218309/article/details/81669227
当进程被加载到内存时,会被分成很多段。
寄存器也是很重要的一个组成部分
EAX:累加(Accumlator)寄存器,常用于函数返回值
EBX:基址(Base)寄存器,以它为基址访问内存
ECX:计数器(Counter)寄存器,常用作字符和循环操作中的j计数器
EDX:数据(Date)寄存器,常用于乘除法和I/O指针
EXI:源变址寄存器
DSI:目的变址寄存器
ESP:堆栈(Stack)指针寄存器,指向堆栈顶部
EBP:基址指针寄存器,指向当前堆栈底部
EIP:指令寄存器,指向下一条指令的地址
1.checksec
没有栈保护们也没有地址随机机制
2.file查看文件 3.nc尝试连接文件
4.ida反编译文件
发现主函数的这个函数中,缓冲区0x88,但是可以读入0x100,明显的缓冲区溢出,那么这个时候我们就在溢出区中想办法构造一个高等级的函数
而在右边恰好有一个system的plt地址,然后我们在尝试找一下是否有/bin/sh这个参数,来构造shell,输入alt+t查找字符串,发现是存在的
5.构造exp
那么在实现exp的有个重点,那就是payload的构造,除了需要0x88长度的字符覆盖分配的缓冲区,还需要0x04的长度覆盖在调用另一个函数时保存的调用函数的基址指针ebp
这个时候,后面就可以跟上我们想要调用的函数的函数地址,即system,而在构造函数栈时,函数结构为调用函数地址-》函数返回地址-》参数1-》参数2-》...-》参数n
所以后面还需要覆盖函数返回地址后再递入参数。
所以payload=‘a’*(0x88+0x04)+p32(sysadd)+p32(0)+p32(binshadd)
exp
6.得到结果