start
分析: ret2shellcode
流程:传入shellcode 并且执行
要点:
1.得到溢出,劫持控制流,需要的偏移和可以利用得长度
根据ida的反编译结果中 输入函数的代码可得, 实际最大输入字符数0x3c(60) ,程序预计最大输入长度0x14(20),所以需要的偏移是0x14 ,可以利用的长度是 0x3c - 0x14 (40)2.选择可以使用的shellcode
shellcraft.sh() 生成的shellcode长度位41 超过了可以利用的长度,所以选择了另一个长度位21的shellcode3.获取shellcode的地址
因为gdb调试的结果中栈地址不断变化,所以不能采用蒸米教程中的内存溢出,并用gdb分析结果文件的办法获取shellcode地址。并且因为该题中有 push esp 将栈地址保存入栈中 和 sys_write(1 , esp , 0x14) 输出栈顶值得函数调用,因而选择在程序中泄露栈地址 , 然后推算shellcode地址
tip: 获得的esp地址 是 push esp 之前的 栈顶地址 , 所以 当前栈顶地址为获取的esp地址 - 4 , 所以 addr_shellcode地址 = (addr_esp - 4 ) + 0x14 + 4 = addr_esp + 0x14
orw
- file :32位 程序
- checksec : statck canary
- 题目提示 : Read the flag from /home/orw/flag. Only open read write syscall are allowed to use.(即 在只允许使用open read write 的条件下 获取 flag )
- 分析过程 :运行可以看到 give me your shellcode ,结合 ida 反汇编的结果确认, 该程序会直接执行输入的shellcode
- 考点 : 手动编写shellcode的能力
- 额外知识 :
calc
- 文件信息:
- 静态链接
- nx | canary
- elf文件中 无 system函数 和 "/bin/sh\x00" - 功能 :计算器 计算输入的表达式
- 详细流程 :
- 过滤输入 | 只允许 + - * / % 和 数字进入
- 初始化数字栈
- 处理表达式
- 3.1 检测到非数字(操作符)后 将 操作符前的字符串 (input_str[ last_pos : now]) 转化为数字存储进数字栈
- 3.2 检测该数字是否为0 (防止 divison by 0)
- 3.3 检测操作符 下一个字符是否是数字 (防止连续使用多个操作符)
- 3.4 检测操作符栈是否有值
- 3.4.1 无 | 将当前操作符压入栈
- 3.4.2 有 | 判断操作符优先级
- 3.4.2.1 当前操作符优先级高于栈顶操作符 | 将 当前操作符压入栈
- 3.4.2.2 当前操作符优先级 <= | 执行栈顶操作符 并将当前操作符压入栈
- 3.4.2.3 default | 执行栈顶操作符
- 处理表达式
-
漏洞点 :
- 执行操作符时未检测数字栈中是否有数字 , 如果第一个数字不填入,就可以手动改写数字栈的索引值 , 从而造成栈上相对地址的任意读写
漏洞代码 ida 伪代码 如下图:
- 漏洞利用思路:
- 因为 题目文件 是 静态链接 且 没有 system函数 和 "/bin/sh\x00" , 所以考虑 使用syscall | ret2syscall
- 调用read 输入 /bin/sh\x00 ,并执行 execve("/bin/sh\x00" , null , null) 从而 getshell
dubblesort
- 这道题目基本都是参考大佬们的wp做出来的,学习到了不少
- 参考wp
-
- scanf("%u") 输入不合规 时 可以不修改目标地址的值 ,处理输出不当会造成泄露
- 不合规输入 "+" "-" 会不修改并泄露 | 本题使用了 fflush 处理了输出,所以没有泄露
- 不合规输入 如 "ab " 会占用输入缓冲区(会阻碍其他scanf的执行),直到 正确处理了这个输入
- 栈中 libc相对地址 与 libc_base 的偏移和 libc的版本有关 | readelf -S 查看段偏移
- one_gadget可能全都不适用
- 如果本地运行的栈相关值和远程运行的不同,记得在所有需要的地方做出调整 | 本地 一个溢出的填充 和远程不同 让我多看了一个小时。。。
- 功能 :
- 输入指定数量个数字 , 排序并输入 (小 -> 大)
- 漏洞点
- 输入的数字数量不限制造成栈溢出
- name的输入未加结尾符导致 leak
- scanf(“%u”) 通过 "+" 的输入可以不修改目标地址的值造成 绕过canary
- 利用过程
- 利用 name leak处 libc的相关地址,从而获取 system 和 "/bin/sh\x00" 的地址
- 利用 scanf("%u") 的点 绕过 canary
- 利用 输入的数字 覆盖 ret地址 之后的值 来执行 system("/bin/sh\x00") getshell