![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
CTF-PWN-栈溢出
文章平均质量分 82
看星猩的柴狗
IT爱好者一枚,菜狗CTF-PWN手,记录自己的学习经历,请大佬多多指点
展开
-
CTF-PWN-栈溢出-中级ROP-【栈迁移】
所以此时的gadget应该是能够进行栈迁移的,即为待会要改到的rsp值+修改参数的gadget+read函数+leave_ret,此时由于想直接用程序内的gadget来构造参数,此时可以以原函数开始准备read函数调用的地址作为调用read函数地址,此时可以参数构造就不要担心需要找gadget或者直接利用read函数后rdi rsi rdx没有被修改的特点从而只修改rsi即可,正好存在这样的gadget(main函数ret结束前调用的最后一个函数是向bss段输入数据)。原创 2024-01-09 22:04:12 · 1303 阅读 · 0 评论 -
CTF-PWN-栈溢出-高级ROP-【SROP】
SROP(Sigreturn Oriented Programming) 于 2014 年被 Vrije Universiteit Amsterdam 的 Erik Bosman 提出,其相关研究Framing Signals — A Return to Portable Shellcode发表在安全顶级会议 Oakland 2014 上,被评选为当年的 Best Student Papers。论文和PPT如下。原创 2024-01-04 19:56:12 · 934 阅读 · 0 评论 -
CTF-PWN-栈溢出-初级ROP-【ret2libc】
当发生信号处理时,会调用func对于的函数。此时注意nptr是输入的内容的起始地址,而&savedregs顾名思义并查看IDA就知道其是栈上保存着rbp的位置,v7是输入的长度,此时存在溢出,当memcpy后可能使得复制的值到到返回地址。ret2libc即控制程序去执行libc库中的函数,通常是返回至某个函数的 plt 处或者某个函数的具体位置 (即某个函数对应的 got 表项的内容)1.dlopen将指定的动态库以特定的方式装载到当前进程实体,并返回一个可操作的句柄,用以后续获取函数地址等操作;原创 2024-01-02 20:51:55 · 1295 阅读 · 0 评论 -
CTF-PWN-栈溢出-中级ROP-【BROP-2】
此时将输出函数puts在got表中的地址作为参数,调用puts函数,从而得到puts的真实地址,进而得到libc基地址。注意此时不要关闭传输通道,不然进程再次重启,对应的puts的真实地址会改变,其libc基地址也会改变,所以此时得到puts函数真实地址后跳转到主函数(返回地址是stop_addr),然后计算得到libc基地址和system地址和/bin/sh的地址,然后再次输入构造的ROP链即getshellput_got_addr=0x601018 # 查看binary_file找到got表的地址。原创 2023-12-26 23:51:45 · 1149 阅读 · 0 评论 -
CTF-PWN-栈溢出-中级ROP-【BROP-1】
此时得到二进制文件后,找到输出函数的对应plt位置,找到其中跳转指令中存在输出函数在got表的地址,然后再次输出,此时参数为输出函数在got表中的地址,此时可以得到输出函数的真实地址,最后得到libc基地址并计算出/bin/sh的地址和system的地址,如果没有此时可以利用read函数或write函数写入可写的内存,参数自己构造,所以知道地址,然后调用系统调用或system都行,只不过系统调用还需构造其他参数。即没有得到源码或者可执行程序文件的情况的文件下,只有一个提供的功能端口进行攻击。原创 2023-12-26 22:24:23 · 1238 阅读 · 0 评论 -
CTF-PWN-栈溢出-基本ROP-【ret2syscall】
发现这里有个move %rbp %rsp,那么如果之前存储的rbp合适的话,那么可以继续ROP,rbp应该为在syscall调用前的前十六个字节,因为还要有pop rbp和pop rbx得抵消掉。64位的系统调用号放在rax 传参依次是 RDI、RSI、RDX、R10、R8、R9 (和64位函数传参一样)如果发现start和end相同时,重写输入,否则返回输入的数据所在数组的一个start位置所在的字节。32的系统调用号与64位的不大一样 使用的时候最好百度一下。这里的sys_read存在很明显的溢出。原创 2023-11-21 16:53:00 · 272 阅读 · 0 评论 -
CTF-PWN-栈溢出-基本ROP-【ret2shellcode】
C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。栈溢出,同时栈上可执行,利用泄露的buf地址作为返回地址,同时将shellcode写入buf。这里read存在栈溢出,同时第一个fprintf输出了buf的地址。Has RWX segments提示有可读可写可执行的段。接受字节‘0x ……’的处理,先化整型然后p64处理。shellcode一个不行就换下一个。控制程序去执行我们自己填充的代码。原创 2023-11-16 22:23:17 · 129 阅读 · 0 评论 -
CTF-PWN-栈溢出-基本ROP -【re2text】
volatile 关键字是一种类型修饰符,volatile 提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。随着NX保护开启,往栈上或堆上直接注入代码无法实现,目前通过ROP(Return Oriented Programming)来绕过保护。如果gadget每次地址不是固定,那么就需要想办法动态获取对应的地址了。可以找到满足的gadgets以及相应的gadget地址。即返回时,程序执行程序本身的代码(.text代码段)原创 2023-11-12 11:36:02 · 55 阅读 · 0 评论 -
CTF-PWN-栈溢出-【前置知识】
64位:前六个参数为RDI RSI RDX RCX R8 R9 (寄存器内容:字符串为指针,数的为对应的编码,字符为其对应的编码)更多的保存在栈上。(2)函数B在使用寄存器%rbx,先保存寄存器%rbx的值,在函数B返回之前,要恢复寄存器%rbx原来存储的内容,这种策略被称之为被调用者保存。(1)在函数A在调用函数B之前提前保存寄存器%rbx的内容,执行完函数B之后再恢复%rbx的内容,这个策略就称为调用者保存;函数调用时,函数的参数入栈,返回地址入栈,然后进入函数,函数的局部变量入栈。原创 2023-11-12 16:07:15 · 67 阅读 · 0 评论 -
CTF-PWN-栈溢出-【原理】
溢出是指某个变量中写入的字节数超过了这个变量本身所申请的字节数,导致与其相邻的变量的值被改变。原创 2023-11-13 00:14:54 · 122 阅读 · 0 评论