picoctf-2018 | pwn wp
2019-01-13 本文已影响0人
fantasy_learner
bufferoverflow0
- 功能分析 :
- 绑定 11 信号为 错误函数(输出 flag)。
- 利用过程:
- 输入长度 超过 0x1c ,会破坏 ret。
- 从而 触发 11 信号的绑定函数.
- tip : 因为 flag 在 bss段 , 还可以 栈溢出 , 设置 为 puts(&flag)
exp
bufferoverflow1
- 漏洞点 : 输入长度不限制,造成栈溢出
- 利用 : 覆盖 ret 为 win 函数
exp
bufferoverflow2
- 漏洞点 : 输入长度不限制 , 造成栈溢出
- 利用 : 与 bufferoverflow1 相比, 需要利用栈溢出 , 调用传参函数 win(0xdeadbeef , 0xdeadc0de)
bufferoverflow3
- 功能分析:
- 读入 canary.txt , 取出前 4 个字符为 canary
- 根据输入指定 输入长度 | 栈溢出
- 对 栈上地址 进行指定长度的输入
- 判断 canary 是否被改变 , 没有被改变过,就ret
- 利用过程:
- 因为 canary 是从文件中的读取的4字节,所以不会变化,可以爆破获得
- tip: 应该 利用 read 的特点(不会为输入的尾部加上 \x00),逐个字符进行爆破,从而降低爆破的难度 (全部字符直接进行爆破 , 难度 256 ^ 4 , 逐个字符爆破 , 难度 256 * 4)
- 因为 canary 是从文件中的读取的4字节,所以不会变化,可以爆破获得
can-you-gets-me
- x86 elf | 静态链接
- 漏洞点:
- gets 输入造成栈溢出
- 利用过程:
- ret2syscall (execve("/bin/sh\x00" , null , null))
- 将 /bin/sh 输入到 bss段 (利用 pop ecx 和 pop [ecx])
- eax , 0xb
- ebx , bss
- ecx , 0 (null)
- edx , 0 (null)
- int 0x80 | 执行函数
- ret2syscall (execve("/bin/sh\x00" , null , null))
echoo
- 漏洞点:格式化字符串
- 流程分析 :
- 读入 flag 在栈中
- 循环 读入和输入 格式化字符串
- 利用 :
- %8$s ,该格式化字符串,可以输出栈中的flag
got-2-learn-libc
- 流程分析:
- 输出 puts 等函数的地址和 /bin/sh 的字符串地址
- gets读入字符串,造成栈溢出
- 利用过程:
- 获取 puts 函数地址 和 /bin/sh 地址
- 利用 LibcSearcher 根据 puts 地址 获取 system 地址
- 栈溢出 调用 system("/bin/sh\x00")
got-shell
- 流程分析 :
- 输入 地址
- 输入 值
- 综合 : *地址 = 值
- 利用点:
- 根据 got 机制, 修改 exit@got 的 值 为win , 从而在 exit 时调用 win
shellcode
- 流程分析 :
- 用户 输入 一段 shellcode
- 执行 shellcode
- 利用过程
- 使用 shellcraft 生成一段 shelllcode
- 输入 ,getshell
gps
- 流程分析:
- 输出一个栈地址( 根据 rand() 的结果 做了一定处理 )
- 在栈中 $rbp - 0x1010 输入 0x1000 个字符
- 输入一个地址 , 并且 跳转到该地址
- 考察点:
-
- 抗随机化 的 shellcode
- 1.1 随机化的点 :输出的栈地址 被 随机数处理过,从而无法根据它找到 shellcode的具体输入地址 , 变化范围 ([- 0x29c , 0x29c])
- 1.2 抗随机化的 解决方法: nop 指令
-
- 利用过程
- 获取栈地址 并加上 0x29c , 确保 >= $rbp - 0x1010
- 利用 shellcraft.amd64.linux.sh() 生成 shellcode
- 利用 nop 对 shellcode 的 前部进行填充
- 输入 shellcode , 跳转 栈地址 执行
leak-me
- 流程分析:
- 输入 name <= 0x100
- 在 name 的输入之后,填入 28 个字符的字符串
- 输入 密码 进行 与 password.txt 的内容 进行比较判断
- 利用过程:
- 填充 name , 从而 leak password
- 读取泄露的 password , 从而输入password , 通过判断
ropchain
- 流程分析:
- gets 造成 栈溢出
- 利用过程:
- 调用 win_function1 ,设置 win1 = 1
- 调用 win_function2(0xBAAAAAAD) , 设置 win2 = 1
- 调用 flag