PWN学习
记录
半岛铁盒@
打油!干饭人!
展开
-
(pwn) C语言 write函数且使用write函数泄露 libc版本
ssize_t write(int fd,const void*buf,size_t count);参数说明:fd:是文件描述符(write所对应的是写,即就是1)buf:通常是一个字符串,需要写入的字符串count:是每次写入的字节数payload=p32(write_plt)+p32(main)+p32(1)+p32(write_got)+p32(4)r.recvuntil("What is your name?")r.send(payload)...原创 2021-08-16 15:37:16 · 3859 阅读 · 1 评论 -
CTF ---pwndbg 调试常用命令
stack30 查看栈布局有30个大小原创 2021-08-13 16:38:54 · 1233 阅读 · 1 评论 -
pwn(ctf)中常见的系统调用
64位文件下1.将rax设置为3B(59),调用了execve,execve函数作用是执行一个新的程序,程序可以是二进制的可执行程序,也可以是shell、pathon脚本,这个跟system函数差不多2. ------- 15的系统号是rt_sigreturn3.sys_read 的调用号 为 0 ;sys_write 的调用号 为 1...原创 2021-08-09 23:25:58 · 883 阅读 · 0 评论 -
fastbin attack攻击中关于 malloc__hook
概述在程序中设置钩子,用来在malloc,,对其进行检查,可以看到对应的函数调用后的地址是什么。malloc__hook 也位于libc中的data段它是一个地址当调用 malloc 的时候 它会发生跳转到malloc__hook 所指向的地址当我们把malloc__hook 所指向的地址 改为 system(“bin/sh”)再次调用 malloc 的时候 就会发生跳转到 system() 处操作上述前提是获取 malloc__hook 的地址有一个固定的偏移 (libc2.23 //原创 2021-07-20 18:02:08 · 573 阅读 · 0 评论 -
CTF(pwn)堆利用 之 off by one
简介利用思路原创 2021-07-01 18:15:56 · 274 阅读 · 1 评论 -
CTF(pwn) 堆利用 之 unlink 介绍
unlink是链表中常见的操作,而我们需要利用这个过程通过改变链表指针,使中间堆块拿出来当前的unlink会有一个对链表的完整性检查的// 由于 P 已经在双向链表中,所以有两个地方记录其大小,所以检查一下其大小是否一致(size检查)if (__builtin_expect (chunksize(P) != prev_size (next_chunk(P)), 0)) \ malloc_printerr ("corrupted size vs. prev_size");原创 2021-07-01 11:41:56 · 933 阅读 · 2 评论 -
在安装one_gadget遇到 one_gadget requires Ruby version >= 2.4. 的问题解决
需要更新 2.6,方法如下,先添加仓库:sudo add-apt-repository ppa:brightbox/ruby-ngsudo apt-get update删除低版本的 ruby:sudo apt-get purge --auto-remove ruby安装 ruby-2.6 版本:sudo apt-get install ruby2.6 ruby2.6-dev...原创 2021-06-28 16:23:50 · 1073 阅读 · 2 评论 -
关于解决安装pwndbg问题sys.stderr.write(f“ERROR: {exc}“) /usr/bin/python3.5: No module named ensurepip
刚开始在网上找到了解决方案我使用的时候发现链接已经更改过期了出现了404的现象耗了我好多时间发现把命令改为 https://bootstrap.pypa.io/pip/{version}/get-pip.py这个就可以了 wget https://bootstrap.pypa.io/pip/3.5/get-pip.py然后执行下一个命令 python3 get-pip.py就可以了如果出现报错ERROR: This script does not work on Py.原创 2021-06-28 14:58:29 · 2111 阅读 · 4 评论 -
CTF(pwn) Fastbin Attack
Fastbin AttackFastbin Double Free其中linux中会有一个校验对于double free即会判断当前 fastbin链表的头部,是否和当前释放的fastbin 是否是一样的,若是一样的话会报错绕过方法是释放时间隔一个堆块连续释放的话会报错的...原创 2021-06-21 15:14:23 · 248 阅读 · 0 评论 -
扩展虚拟机Ubuntu磁盘容量空间
这种情况下前提是需要我们把之前所创建的快照删除才可以开机进入系统,安装gparted分区管理工具,终端中运行sudo apt-get install gparted选中sa1,右键 更改大小把之后的空余空间改为1024剩下的为新大小之后右键未分配的空间点击新建改为扩展分区,添加完成后,选中新出现的未分配分区,右键新建弹出的窗口,选择文件系统为:linux-swap确认参数无误,点击上面(√)确认按钮点击应用,执行修改大约10分钟,完成所有操作查看系统硬盘是否成功.原创 2021-06-16 15:27:03 · 176 阅读 · 0 评论 -
CTF pwn普通UAF题目模板
from pwn import *context(log_level=‘debug’)elf=ELF(’./)r=remote("","")#r=process(’./’)def create(size,content):r.sendlineafter("Your choice: ",‘1’)r.sendlineafter("Please input size: ",str(size))r.sendafter("Please input content: ",content)def del原创 2021-06-15 17:00:37 · 527 阅读 · 0 评论 -
栈劫持(栈迁移)介绍
栈劫持栈劫持也可以称为栈迁移,用来解决栈本身可以利用的空间不够用,一般是溢出空间不够用,没办法有效构造rop链。这个时候我们可以通过劫持ebp的方式,利用leave 和 ret两个汇编指令来做到栈劫持(栈迁移)。汇编指令leave 等价于mov ebp,esp; pop ebp;ret 等价于 pop eip;这两个指令常常用于把之前所开辟的栈帧给还原,并接着向下执行下一条指令leave -> 把前面抬起来的栈帧给退下来retn -> 把一开始call调用函数的返回地址给原创 2021-06-14 14:20:29 · 711 阅读 · 0 评论 -
关于 ESP,EBP,EIP
当调用fun函数开始时,三者的作用。1.EIP寄存器里存储的是CPU下次要执行的指令的地址。也就是调用完fun函数后,让CPU知道应该执行main函数中的printf(“函数调用结束”)语句了。2.EBP寄存器里存储的是是栈的栈底指针,通常叫栈基址,这个是一开始进行fun()函数调用之前,由ESP传递给EBP的。(在函数调用前你可以这么理解:ESP存储的是栈顶地址,也是栈底地址。)3.ESP寄存器里存储的是在调用函数fun()之后,栈的栈顶。并且始终指向栈顶。...原创 2021-06-13 12:46:33 · 1516 阅读 · 0 评论 -
堆溢出漏洞之UAF--(Use After Free)
具体原理在释放内存后未将指向原内存的指针置为null,use after free的意思就是在释放以后进行use。当我们重新申请与之前释放掉的内存大小相同的块时,就会就先问题.可以继续使用之前释放掉的那块内存。但是再次使用时,因为指针指向的内存包含的数据不是原来的数据了,此时的引用对于正常程序来说是有风险的;这是个UAF的错误例子...原创 2021-06-02 17:57:09 · 978 阅读 · 0 评论 -
堆概述(二)
当一个较小的chunk被释放的时候,并不会马上还给系统,会让bin来管理这部分的chunk原创 2021-05-20 10:30:21 · 109 阅读 · 0 评论 -
堆概述(一)
堆在程序运行过程中,堆可以提供动态分配的内存,允许程序申请大小未知的内存。堆其实就是程序虚拟地址空间的一块连续的线性区域,它由低地址向高地址方向增长。我们一般称管理堆的那部分程序为堆管理器。堆管理器处于用户程序与内核中间,主要做以下工作1.响应用户的申请内存请求,向操作系统申请内存,然后将其返回给用户程序。同时,为了保持内存管理的高效性,内核一般都会预先分配很大的一块连续的内存,然后让堆管理器通过某种算法管理这块内存。只有当出现了堆空间不足的情况,堆管理器才会再次与操作系统进行交互。⒉管理用户所释放原创 2021-05-15 11:04:07 · 335 阅读 · 0 评论 -
CTF-pwn上的一次远程本地链接
命令ssh -p 29662 CTFMan@node3.buuoj.cn常规命令 ssh user@192.168.1.100这里 -p的作用是:一般ssh定义的端口号是22,若是有所改动就用-p + 改动的端口号原创 2021-04-29 23:23:52 · 859 阅读 · 0 评论 -
对抗canary保护技术的几种方式
一.泄露canary的值利用泄露得到canary的值,溢出的时候 输入等于canary的值即可绕过二.泄露fs:28h的值三. 劫持stack_chk_fail即把got表中的存的内存地址,改为system函数的地址,第二次调用的时候就会返回的system函数四.stack smashing五.逐字节爆破...原创 2021-04-20 21:47:39 · 292 阅读 · 1 评论 -
二进制安全基本常识
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的或者初始值为0的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。bss段也叫(全局变量段)的特点是可读可写可执行,由于bss段具有该特点,有时候利用可以将程序的执行流劫持到bss段上,来执行我们的shellcode数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。代码段:代码段(co原创 2021-04-19 09:15:00 · 929 阅读 · 0 评论 -
开辟与退出一个新的栈帧常用的汇编语言指令
假如三条指令在vuln函数里面执行push rbp -> 把rbp保存下来mov rbp,rsp -> 把rbp抬到一个新的栈帧sub rsp,10h ->创建了一个新的栈帧,并把栈底抬上来二.退出之前常用的两个指令leave -> 把前面抬起来的栈帧给退下来retn -> 把一开始call调用函数的返回地址给弹出来,即执行call下一条指令;...原创 2021-04-17 14:16:16 · 528 阅读 · 0 评论 -
关于栈的写入和延伸的方向
延伸: 由高地址向低延伸写入: 由低地址往高写入原创 2021-04-16 14:04:36 · 245 阅读 · 0 评论 -
关于addr=u32(r.recvuntil(‘\xf7‘)[-4:])的解释
有时候我们写EXP的时候对于32位文件ROP在接收函数地址的时候我们会用到addr=u32(r.recv(4))但这个命令有时候 会失效,接收不到;这时候就会用到addr=u32(r.recvuntil('\xf7')[-4:])这涉及到个debug调试查看context.log_level="debug"可以看到我们传入的a字符串结束的地方是0x7C,后面跟着的就是我们泄露出来的write函数的地址,我写的意思是从0x7F(这一行末尾),[-4:]即([::-4])往前截取4字节,得到原创 2021-04-15 13:30:05 · 1972 阅读 · 3 评论 -
有关(_DWORD *)的解释
在IDA反编译查看时,时常会看到(_DWORD *)这里(_DWORD *)是对v6进行强制类型转化,,然后在提领指针WORD占2个字节,DWORD占4个字节。知道这一点,有助于我们写payload 知道溢出覆盖多少字节原创 2021-04-11 15:04:20 · 2968 阅读 · 0 评论 -
PWN中的gdb调试, pwndbg,peda,gef 切换使用的方法;
peda 用来做逆向破解是最方便的gef 用来 debug 最好pwndbg 做pwn题很方便当你把三款调试工具装完之后,他们不能同时使用,并且他们的切换也不方便三个插件的下载Pedagit clone https://github.com/longld/peda.git ~/pedaecho "source ~/peda/peda.py" >> ~/.gdbinitGefwget -q -O- https://github.com/hugsy/gef/raw/mas原创 2021-04-09 09:07:58 · 4687 阅读 · 3 评论 -
(格式化字符串漏洞).fini.array劫持,使程序流程循环进行
用gdb调试main函数的时候,不难发现main的返回地址是__libc_start_main也就是说main并不是程序真正开始的地方,__libc_start_main的执行是在main的前面。可以发现__libc_start_main函数的参数中,有3个是函数指针:其中__libc_csu_fini是在main执行完毕后执行的简单地说,在main函数后会调用.init段代码和.init_array段的函数数组中每一个函数指针。而我们的目标就是修改.fini_array数组的第一个元素为star原创 2021-04-04 22:48:08 · 902 阅读 · 0 评论 -
整数溢出详解
在 C 语言中,整数的基本数据类型分为短整型 (short),整型 (int),长整型 (long),这三个数据类型还分为有符号和无符号,每种数据类型都有各自的大小范围当程序中的数据超过其数据类型的范围,则会造成溢出,整数类型的溢出被称为整数溢出。有以下两种情况????1.未限制范围2.错误的类型转换size_t,该类型相当于 unsigned long int,属于无符号长整型...原创 2021-04-04 07:23:11 · 3114 阅读 · 0 评论 -
Pwntools---fmtstr_payload()介绍
fmtstr_payload是pwntools里面的一个工具,用来简化对格式化字符串漏洞的构造工作。可以实现修改任意内存fmtstr_payload(offset, {printf_got: system_addr})(偏移,{原地址:目的地址})fmtstr_payload(offset, writes, numbwritten=0, write_size=‘byte’)第一个参数表示格式化字符串的偏移;第二个参数表示需要利用%n写入的数据,采用字典形式,我们要将printf的GOT数据改为s原创 2021-04-03 11:07:41 · 5553 阅读 · 1 评论 -
CTF(Pwn) 当题目为我们提供Libc版本.so文件, 与 不提供的区别
做了一道题目,它提供了 libc文件;这道题 可以使用 libc-2.23.so文件 来 解出来, 也可以不使用;当使用 libc2.23.so文件时 EXp为from pwn import *p = remote("node3.buuoj.cn",29829)libc=ELF('libc-2.23.so')elf = ELF('./pwn1')write_plt = elf.plt['write']write_got = elf.got['write']main = 0x0804原创 2021-03-25 14:19:19 · 4962 阅读 · 1 评论 -
加速安装LibcSeacher
git clone加速方法:将github.com 换为github.com.cnpmjs.org即可实现加速git clone https://github.com.cnpmjs.org/lieanu/LibcSearcher.gitcd LibcSearcherpython setup.py install原创 2021-03-24 13:25:22 · 2469 阅读 · 0 评论 -
CTF-IDA的常用操作(初学者)
楼主临时起意往后会有补充~~1.shift+F12 查看string信息 (通常可以看到重要的信息 )2.Alt + T 查找带有目标字符串的函数3. F5 查看 C代码4. Ctrl + F 在函数框中 搜索函数5. 空格键 流程图与代码 来回切换....原创 2020-11-30 21:31:11 · 2893 阅读 · 0 评论 -
如何在IDA软件中找到自己需要的目标函数(关键函数)
这个问题很困扰我们这些初学者 特此记录~~~一.提前要记住IDA的基操~~1.shift+F12 查看string信息 (通常可以看到重要的信息 )2.Alt + T 查找带有目标字符串的函数3. F5 查看 C代码4. Ctrl + F 在函数框中 搜索函数5. 空格键 流程图与代码 来回切换.二.讲解从题目下下载好附件后在IDA中打开,发现没有main函数(即关键代码所在的函数);这时候我们按 Ctrl + F12看到了flag, wrong, 但是发现了一个原创 2020-11-30 21:56:30 · 17253 阅读 · 3 评论 -
CTF(Pwn)32位文件 和 64 文件 的 差异
一. 地址方面字节上的差异32位是cpu一次处理的位数,即32位4字节,相当于地址的宽度,即sizeof(*p);虚拟地址大小为4G,即有2的32次方个地址,从32个0到32个1个地址;![在这里插入图片描述](https://img-blog.csdnimg.cn/20210323094254825.png)64位是cpu一次处理的位数,即64位8字节,相当于地址的宽度,即sizeof(*p);虚拟地址大小为128G,即有2的64次方个地址,从64个0到64个1个地址;在写Exp原创 2021-03-23 09:46:16 · 1496 阅读 · 0 评论 -
CTF(Pwn) Rop + ret2libc 题型 常规解法思路 (初级)
引子随着 NX 保护的开启,以往直接向栈或者堆上直接注入代码的方式难以继续发挥效果。攻击者们也提出来相应的方法来绕过保护,目前主要的是ROP(Return Oriented Programming),其主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段(gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。所谓 gadgets 就是以 ret结尾的指令序列,通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行流程。之所以称之为 ROP,是因为核心在于利用了指令原创 2021-03-22 21:59:49 · 1124 阅读 · 0 评论 -
strlen()函数 与 “\0“ 的关系 与 利用;strcmp()
众所周知strlen()函数是用来计算长度的;strlen()函数 与 “\0” 的关系strlen() 在读取字符串的时候 会 一直读到 \0 处停止;例如以下代码;结果为2; 只读取了 ab部分;利用这是一个加密函数, 当我们不想让我们输入的字符串被加密的时候,我们需要满足 if 条件来退出; 此时只要在 字符串前面加上 '\0’即可;...原创 2021-03-21 10:41:04 · 15513 阅读 · 0 评论 -
(Pwn)CTF工具 ROPgadget 的安装与使用介绍
一. 介 绍使用此工具,您可以在二进制文件中搜索Gadgets,以方便您对ROP的利用。我们知道x86都是靠栈来传递参数的而x64换了它顺序是rdi, rsi, rdx, rcx, r8, r9,(这里6个寄存器可以被理解为Gadgets)如果多于6个参数才会用栈我们要先知道这个特性.有的题,里面既没有现成的system也没有/bin/sh字符串,也没有提供libc.so给我们,那么我们要做的就是想办法泄露libc地址,拿到system函数和/bin/sh字符串;我们就需要获取rdi, rsi,原创 2021-03-10 11:39:17 · 15556 阅读 · 4 评论 -
ctf(pwn)栈溢出介绍
栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。这种问题是一种特定的缓冲区溢出漏洞,类似的还有堆溢出,bss段溢出等溢出方式。栈溢出漏洞轻则可以使程序崩溃,重则可以使攻击者控制程序执行流程。此外,我们也不难发现,发生栈溢出的基本前提是程序必须向栈上写入数据。写入的数据大小没有被良好地控制。一般来说,我们会有如下的覆盖需求覆盖函数返回地址,这时候就是直接看 EBP 即可。覆盖栈上某个变量的内容,这时候就需要更加精细的.原创 2021-03-05 18:32:33 · 1670 阅读 · 2 评论 -
ctf(pwn) canary保护机制讲解 与 解密方法介绍
Canary保护机制canary的意思是金丝雀,来源于英国矿井工人用来探查井下气体是否有毒的金丝雀笼子。工人们每次下井都会带上一只金丝雀如果井下的气体有毒,金丝雀由于对毒性敏感就会停止鸣叫甚至死亡,从而使工人们得到预警。在函数开始时就随机产生一个值,将这个值CANARY放到栈上紧挨ebp的上一个位置,当攻击者想通过缓冲区溢出覆盖ebp或者ebp下方的返回地址时,一定会覆盖掉CANARY的值;当程序结束时,程序会检查CANARY这个值和之前的是否一致,如果不一致,则不会往下运行,从而避免了缓冲区溢出攻原创 2021-03-03 22:41:54 · 2259 阅读 · 1 评论 -
IDA的函数操作,与导航操作;
函数操作实际上,反汇编并不是完全连续的,而是由分散的各函数拼凑而成的。每个函数有局部变量、调用约定等信息,控制流图也只能以函数为单位生成和显示,故正确定义函数同样非常重要。IDA也有处理函数的操作删除函数:在函数窗口中选中函数后,按Delete键。定义函数:在反汇编窗口中选中对应行后,按P键。修改函数参数:在函数窗口中选中并按Ctrl+E组合键,或在反汇编窗口的函数内部按Alt+P组合键。在定义函数后,IDA即可进行很多函数层面的分析,如调用约定分析、栈变量分析、调用参数分析等。这些分析对于还原反原创 2020-12-13 21:56:05 · 1101 阅读 · 0 评论 -
IDA执行python脚本文件,python编辑器的操作
原创 2020-12-13 21:58:52 · 4057 阅读 · 3 评论 -
可以直接反编译Mips架构的IDA版本(无需安装脚本)
介绍未找到这个版本的IDA时需要安装MIPS插件才可以反编译,或者需要记一些MIPS汇编的知识,很不方便,有了这个软件就很nice下载不 讲 武 德提取码8520原创 2020-12-16 23:42:10 · 2092 阅读 · 3 评论