PWN环境搭建
PWN环境搭建前言由于以前用的kali虚拟机本身自带加上一些乱七八糟的环境,现在文件已经过大了,而且很不方便,于是我决定重新一个虚拟机,就用unbuntu20.04的环境去写
虚拟机安装前面的安装就不详细介绍了,网上有很多类似的文章这里就不赘述了
https://zhuanlan.zhihu.com/p/520379844
vmtools安装
https://zhuanlan.zhihu.com/p/617077330
vmtools安装后还无法复制粘贴的问题
https://www.xpwin7.com/jiaocheng/37970.html
设置共享文件夹
https://blog.csdn.net/qq_43725844/article/details/104934171
环境搭建docker搭建https://blog.csdn.net/Tester_muller/article/details/131440306
docker换源
https://blog.csdn.net/weixin_44437060/article/details/129537175
docker-c ...
pwn时报错超时--堆栈未对齐报错原理
pwn时报错超时–堆栈未对齐报错原理
PWN异架构学习-ARM架构题型
PWN异架构学习-ARM架构题型前言学习了一下国资师傅的pwn异架构教程,有很多异架构的题,这里自己做一遍复现一下
ret2libc这些题主要是为了回顾x86架构下的利用方法和ARM架构的结合下的使用。
解题过程通过分析发现存在栈溢出漏洞
1234567891011int dofunc(){ int buf[3]; // [sp+0h] [bp-Ch] BYREF buf[0] = 0; buf[1] = 0; write(1, "input:", 6u); read(0, buf, 0x100u); write(1, "byebye", 6u); return 0;}
exp1国资师傅的利用方法是ret2csu去泄露libc然后执行system(“/bin/sh”)。由于ARM架构是通过POP PC来返回的,一般arm架构都是通过ret2csu(ret2csu用的多)去解,下面是exp
1234567891011121314151617181920212223242526272829303 ...
PWN异架构学习-AARCH64架构题型
PWN异架构学习-AARCH64架构题型前言在学习完ARM架构后,继续学习AARCH64架构的题型,国资师傅说,相比arm架构,AARCH架构才更加能够称为异架构
ret2libc-ARRCH相比起ARM和X86架构,ARRCH架构在函数调用时候的栈的保护措施是不一样的,栈的返回地址和上一个栈帧的栈底是在当前栈帧的低地址,于是我们在进行栈溢出的时候是不能覆盖我们当前栈帧的返回地址的。
解题过程通过分析发现存在栈溢出漏洞
12345678910__int64 dofunc(){ __int64 buf; // [xsp+18h] [xbp+18h] BYREF buf = 0LL; write(1, "input:", 6uLL); read(0, &buf, 0x100uLL); write(1, "byebye", 6uLL); return 0LL;}
exp国资师傅的利用方法是ret2csu去泄露libc然后执行system(“/bin/sh”)。但是由于我们无法覆盖当前栈帧的返 ...
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堆溢出技巧:ORW的解题手法与万金油Gadgets
PWN堆溢出技巧:ORW的解题手法与万金油Gadgets前言在做堆题的时候基本上都会结合沙箱去出了,不再是单一的getshell了,感觉出的越来越卷了,本文将介绍一下堆溢出的一些ORW做法
思路低版本在 Glibc2.29以前的 ORW解题思路已经比较清晰了,主要是劫持 free_hook 或者 malloc_hook写入 setcontext函数中的 gadget,通过 rdi索引,来设置相关寄存器,并执行提前布置好的 ORW ROP chains,查看setcontext函数发现,在修改rcx的值后接着有个push操作将rcx压栈,然后汇编指令按照顺序会执行截图中最后的retn操作,而retn的地址就是压入栈的rcx值,因此修改rcx就获得了控制程序流程的能力。
1234567891011121314151617<setcontext+53>: mov rsp,QWORD PTR [rdi+0xa0]<setcontext+60>: mov rbx,QWORD PTR [rdi+0x80]<setcontext+67>: mov ...
PWN做题时获取地址的方法总结
PWN做题时获取地址的方法总结在漏洞利用的过程中,我们常常需要获取一些变量,函数的地址,以便于能够进行进一步的利用。
这里我将获取地址的方法分为如下几类
直接寻找地址,即我们可以通过反编译等手段直接看到对应符号的地址。
泄漏地址,即需要我们通过控制程序的执行流来泄漏程序中的某些符号指针的内容,来获取对应的地址。
推测地址,这里我们一般常用的就是根据某个段内的符号之间的偏移是固定的,从而来推断一些新的符号的地址。
猜测地址,一般主要指的是,我们需要自己去猜测对应符号的地址,这里伴随的往往就是暴力枚举了。
上述几种方法,是一种递进地考虑方式,我们在获取相关符号的地址时,应保持这样的思考方式。
在上面的几种方式中,我认为主要有两点核心思想
充分利用代码本身的性质,比如程序某些代码的位置就是固定的,如不开启 PIE 时,代码段的位置;再比如,glibc 的后三位是固定的。
充分利用相对偏移的性质,这是由于目前程序加载时往往加载的内存都是一段一段的,所以相对偏移往往是固定的。
更加具体的,我们可以看如下的介绍。
直接寻找地址程序中已经给出了相关变量或者函数的地址了。这时候,我们就可以直接 ...
PWN——GCC编译中几种保护打开和关闭的参数
PWN——GCC编译中几种保护打开和关闭的参数
NX:-z execstack / -z noexecstack (关闭 / 开启) 不让执行栈上的数据,于是JMP ESP就不能用了
Canary:-fno-stack-protector /-fstack-protector / -fstack-protector-all (关闭 / 开启 / 全开启) 栈里插入cookie信息
PIE:-no-pie / -pie (关闭 / 开启) 地址随机化,另外打开后会有get_pc_thunk
RELRO:-z norelro / -z lazy / -z now (关闭 / 部分开启 / 完全开启) 对GOT表具有写权限
PWNTools的各种函数的使用[官网翻译]
PWNTools的各种函数的使用[官网翻译]ROP函数的使用pwnlib.rop.rop - 面向返回的编程
ROP工具可以用来构建非常简单的堆栈。让我们创建一个假二进制,其中包含一些可能有用的符号。
123>>> context.clear(arch='i386')>>> binary = ELF.from_assembly('add esp, 0x10; ret')>>> binary.symbols = {'read': 0xdeadbeef, 'write': 0xdecafbad, 'exit': 0xfeedface}
创建一个查找二进制符号的ROP对象非常简单
1>>> rop = ROP(binary)
使用ROP对象,可以手动添加堆栈帧。
123>>> rop.raw(0)>>> rop.raw(unpack('abcd' ...



