webpwn学习
webpwn学习前言在HWS遇到一道关于webpwn的题型,虽然后面根据其他师傅的wp复现了感觉不难,但自己分析还是比较麻烦的,这里总结一下webpwn的相关知识。
HWS-httpd整个题其实就是自己实现了httpd的部分功能,听其他师傅说的是用了某个框架,但是修复了其中的路径穿越漏洞。
解题虽然该题修复了路径穿越漏洞,但是还存在一个栈溢出漏洞,并且存在可以在判定完路径穿越后的覆写该路径的漏洞。
通过分析逆向文件,发现存在栈溢出漏洞
又发现在其中一个函数中存在文件执行,但是又从输入的文件名中,把路径穿越漏洞给保护住了
但是文件名名上面存在v12,v12可以在base64解码的时候用来覆盖
于是利用脚本如下
exp1234567891011121314151617181920212223242526272829def base64_encode(text): text_bytes = text.encode('utf-8') # 将文本转换为字节数据 encoded_bytes = base64.b64encode(text_bytes) # 对 ...
VIM使用教程
vim使用教程一,什么是 vim?Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。
连 vim 的官方网站 自己也说 vim 是一个程序开发工具而不是文字处理软件。
vi/vim 按键说明除了上面简易范例的 i, Esc, :wq 之外,其实 vim 还有非常多的按键可以使用。
第一部分:一般模式可用的光标移动、复制粘贴、搜索替换等
移动光标的方法
h 或 向左箭头键(←)
光标向左移动一个字符
j 或 向下箭头键(↓)
光标向下移动一个字符
k 或 向上箭头键(↑)
光标向上移动一个字符
l 或 向右箭头键(→)
光标向右移动一个字符
如果你将右手放在键盘上的话,你会发现 hjkl 是排列在一起的,因此可以使用这四个按钮来移动光标。 如果想要进行多次移动的话,例如向下移动 30 行,可以使用 “30j” 或 “30↓” 的组合按键, 亦即加 ...
Tmux使用教程
Tmux使用教程一、Tmux 是什么?1.1 会话与进程命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称”窗口”),在里面输入命令。用户与计算机的这种临时的交互,称为一次”会话”(session) 。
会话的一个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完。
一个典型的例子就是,SSH 登录远程计算机,打开一个远程窗口执行命令。这时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的。因为上一次 SSH 会话已经终止了,里面的进程也随之消失了。
为了解决这个问题,会话与窗口可以”解绑”:窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候,再让会话”绑定”其他窗口。
1.2 Tmux 的作用Tmux 就是会话与窗口的”解绑”工具,将它们彻底分离。
(1)它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。
(2) 它可以让新窗口”接入”已经存在的会话。
(3)它允许每个会话有多个连接窗口,因此可以多人实时共享会话。
(4)它还支持窗 ...
Python 强制类型转换
Python 强制类型转换前言本篇主要介绍Python的强制类型转换。
软件环境
系统
Kali Rolling (2021.3) x64
软件
Python 2.7.3
IPython 4.0.0
Python数据类型的显式转换数据类型的显示转换,也称为数据类型的强制类型转换,是通过Python的内建函数来实现的类型转换。
显式转换的多种类型
int(x [,base]) ⇒ 将x转换为一个十进制的整数long(x [,base]) ⇒ 将x转换为一个十进制的长整数float(x) ⇒ 将x转换为一个浮点数str(object) ⇒ 转换为字符串repr(object) ⇒ 转换为表达式字符串eval(str) ⇒ 用来计算在字符串中的有效Python表达式,并返回一个对象tuple(seq) ⇒ 将序列seq转换为一个元组list(seq) ⇒ 将序列seq转换为一个列表chr(x ) ⇒ 将一个整数转换为一个字符unichr(x ) ⇒ 将一个整数转换为Unicode字符ord(x ) ⇒ 将一个字符转换为它的整数值hex(x ) ⇒ 将一个整数转换为一个十六进制字符串 ...
PWN题执行system(binsh)错误
PWN题执行system(“/bin/sh”)错误sub rsp, qword ptr [rip + 0x14b45] <0x7ffff7ffc708在system函数plt的时候会去寻找对应的地址,这里我们需要在栈顶上留出足够的空间去让其寻找地址,所以在我们栈迁移去bss段的时候应把bss段的地址写到靠后一点,否则sub减掉后值是无法访问的,
错误/image-20230915143057958.png)
movaps xmmword ptr [rsp + 0x50], xmm0在do_system函数偏移357的位置有个movaps的汇编,在执行这里的时候如果RSP的栈对齐错误的话是无法成功执行的,于是我们需要考虑堆栈对齐的问题,这时候rsp的值加或者减八即可
错误/image-20230915143352618.png)
是xmm寄存器的问题,当glibc版本大于2.27的时候,系统调用system(“/bin/sh”)之前有个xmm寄存器使用。要确保rsp是与16对齐的,也就是末尾必须是0.
mov ...
PWN题常见题型脚本模版
PWN题常见题型脚本模版设置环境绑定要处理的程序1234567# 远程# remote(ip/hostname, port)p = remote("127.0.0.1", 8888)# 本地# 注意process中参数一定要有./p = process("./pwn")
设置上下文环境1234567891011121314151617181920# 设置上下文环境主要用于一些需要上下文的漏洞利用# 比如:shellcode的生成# 设置操作系统context.os = "linux"# 设置32位的体系架构 context.arch = "i386"# 设置64位的体系架构context.arch = "amd64"# 打印交互中的输入和输出context.log_level = "debug"# 也可以直接这样写context(os="linux", arch="amd64", lod_level="debug&q ...
pwn的各类shellcode收集
pwn的各类shellcode收集ORW(64)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354asm( ''' sub rsp, 0x2000 mov eax, 0x67616c66 ;// flag push rax mov rdi, rsp xor eax, eax mov esi, eax mov al, 2 syscall ;// open push rax mov rsi, rsp xor eax, eax mov edx, eax inc eax mov edi, eax mov rcx, 0x8000000000000000 add rdi, rcx mov dl, 8 syscall ;// write open() return value ...
pwn对于64位程序exp运行报错timeout the monitored command dumped coren
[pwn]对于64位程序exp运行报错timeout: the monitored command dumped core\n前言这个问题本来是因为NKCTF中的几道题目,本地是可以的但是远程就是timeout,后来通过其他办法解决了,但是已经看到了这个堆栈的平衡的问题,这里就总结一下吧,万一以后能用到呢。
堆栈平衡64位程序相对于32位程序多了堆栈需要平衡的问题
如果要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址。
如果通过堆栈传递参数了,那么在函数执行完毕后,要平衡参数导致的堆栈变化。
含义:
当函数在一步步执行的时候 一直到ret执行之前,堆栈栈顶的地址 一定要是call指令的下一个地址。
函数执行前一直到函数执行结束,函数里面的堆栈是要保持不变的。
如果堆栈变化了,那么,要在ret执行前将堆栈恢复成原来的样子。
解决办法最主要的办法就是通过ret来让堆栈重新平衡
调用system函数的栈对齐问题这个问题是exp写到后面遇到的问题,东西不多,我就和远程报错总结到一起了,希望以后能找到吧
为什么执行sys ...
PWN堆题换libc方法
PWN堆题换libc方法patchelf12patchelf --set-interpreter ld-2.23.so FILENAME patchelf --replace-needed libc.so.6 FILENAME
基于pwndocker的换libc脚本1234567891011121314151617181920212223242526272829#! /bin/bashif [[ $# < 1 ]]; then echo "Usage: ./chlibc [your_elf] [libc_version] [arch]" echo "2.19 2.23 2.24 2.27 2.28 2.29 2.30" exitfiecho $2#2.19 2.23 2.24 2.27 2.28 2.29 2.30arch=$3libc=$2file=$1echo "Change $file to libc $libc"if [[ $libc != ' ...
PWN做题时获取地址的方法总结
PWN做题时获取地址的方法总结在漏洞利用的过程中,我们常常需要获取一些变量,函数的地址,以便于能够进行进一步的利用。
这里我将获取地址的方法分为如下几类
直接寻找地址,即我们可以通过反编译等手段直接看到对应符号的地址。
泄漏地址,即需要我们通过控制程序的执行流来泄漏程序中的某些符号指针的内容,来获取对应的地址。
推测地址,这里我们一般常用的就是根据某个段内的符号之间的偏移是固定的,从而来推断一些新的符号的地址。
猜测地址,一般主要指的是,我们需要自己去猜测对应符号的地址,这里伴随的往往就是暴力枚举了。
上述几种方法,是一种递进地考虑方式,我们在获取相关符号的地址时,应保持这样的思考方式。
在上面的几种方式中,我认为主要有两点核心思想
充分利用代码本身的性质,比如程序某些代码的位置就是固定的,如不开启 PIE 时,代码段的位置;再比如,glibc 的后三位是固定的。
充分利用相对偏移的性质,这是由于目前程序加载时往往加载的内存都是一段一段的,所以相对偏移往往是固定的。
更加具体的,我们可以看如下的介绍。
直接寻找地址程序中已经给出了相关变量或者函数的地址了。这时候,我们就可以直接 ...