Pwn入门系列8——基本栈溢出
基础栈溢出
①一般来说,在CTF中的PWN,多数情况下我们需要让程序执行这一段代码:
②system(“/bin/sh”)
③也就是说在远程机器上开一个命令行终端。
④这样我们就可以通过命令行来控制目标机器。
ret2text
①理想情况下,程序中有一段代码能直接满足我们的需求
②我们只需要将执行流劫持到这一段代码即可。
ret2shellcode
①如果程序中没有这样的代码,怎么办?
②我们可以自己写shellcode
③shellcode就是一段可以独立运行开启shell的一段汇编代码。
④ret2shellcode的思路就是:
⑤如果程序中存在让用户向一段长度足够的缓冲区输入数据。
⑥我们向其输入shellcode。
⑦将程序劫持到shellcode上即可。
示例
①vul函数存在明显的栈溢出。
②可以劫持控制流到gen_shell函数。
③可以劫持控制流到global_buf(即bss段,全局变量在bss段,向bss段写入shellcode)
④gcc example.c -o example -z execstack -fno-stack-protector -no-pie -z -norelro
⑤编译完成后,sudo chmod +x example(给执行权限)
⑥运行:./example
ret2libc
①有时候我们需要调用一些系统函数,比如说system或者execve等。
②程序中可能不会提供一些现成的函数。
③如果我们拿到了libc中函数的地址,我们可以直接调用libc的函数。
④只需要传递好参数,然后call即可。
⑤那么如何传递参数呢?
⑥如调用system(/bin/sh)
⑦只需要将rdi设置为/bin/sh字符串地址,然后call system即可。
⑧如何设置?
思考
①如果直接mov,然后call,那么就和ret2shellcode无异。
②现在问题是,我们只有一个libc地址和/bin/sh字符串地址,以及一个栈溢出漏洞,怎么传递参数?
③思考如下形式的栈溢出
④pop rdi ret+/bin/sh地址+system
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!