Pwn入门系列8——基本栈溢出

基础栈溢出

①一般来说,在CTF中的PWN,多数情况下我们需要让程序执行这一段代码:
②system(“/bin/sh”)
③也就是说在远程机器上开一个命令行终端。
④这样我们就可以通过命令行来控制目标机器。

ret2text

①理想情况下,程序中有一段代码能直接满足我们的需求
1.png
②我们只需要将执行流劫持到这一段代码即可。

ret2shellcode

①如果程序中没有这样的代码,怎么办?
②我们可以自己写shellcode
③shellcode就是一段可以独立运行开启shell的一段汇编代码。
2.png
④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