1.通过ida查看需要写入多少字节才能到返回地址
使用ida进行反汇编查看
发现存在gets函数 存在溢出漏洞
记录gets函数断点值
使用gdb进行动态调试:
打入断点
r开始执行
查看到 eax 和 esp 的值 如下 通过ebp-eax的值
需要填充0X6C+4个字节才会到返回地址
int x80作用
操作系统提供了中断指令int 0x80来主动进入内核,这是用户程序发起的调用访问内核代码的唯一方式
- 用户程序中包含一段包含int指令的代码,通常是由库函数通过内联汇编插入
- 操作系统写中断处理,获取想调程序的编号
- 操作系统根据编号执行相应的代码
调用系统函数时会通过内联汇编代码插入int 0x80的中断指令,(不仅会插入中断指令,还会将系统调用编号设置给 %eax 寄存器)
内核接收到int 0x80中断后,需要查询IDT表来取出中断处理函数地址,这个地方比较细节的地方是,int 0x80的idt表中的DPL被设置成了3,所以才能从用户态能直接访问int 0x80的中断指令的。
个人理解:当出现int 0x80 时候 ,进入内核,可以使用eax ebx,。。。从而执行对应的系统调用。
其中,该程序是 32 位,所以我们需要使得
- 系统调用号,即 eax 应该为 0xb
- 第一个参数,即 ebx 应该指向 /bin/sh 的地址,其实执行 sh 的地址也可以。
- 第二个参数,即 ecx 应该为 0
- 第三个参数,即 edx 应该为 0
利用工具去匹配pop eax ret
选择第一个:
0x080bb196
匹配ebx
0x0806eb90
匹配“/bin/sb”
080be408
构造playload