Zj_W1nd's BLOG

Awdp-PWN准备技巧

2025/02/25

环境问题

首先,我有两套环境。一个windows一个arch,都是物理机。

其中,windows上拥有kali-wsl和win_penetration_toolkit-vmware,平常的pwn题是采用

  • wsl-kali执行python脚本/gdb调试,patchelf+glibc-all-in-one,windows主机ida分析

缺点是,windows上没有docker。做不了内核题。优点是,windows上具有渗透测试的虚拟机,可以说渗透基本上必须用win(blackarch开发不是很全)

而linux环境上也有原生ida支持,也能做,缺点在于没有杂七杂八的工具比如anytxt,localsend这种,也缺misc工具,以及渗透的工具。

linux准备好ubuntu的三个docker,都安装gdb?

pwn题配置

参考自文章1

文章2(包括流量转发,批量攻击脚本)

准备

手动patch,使用ida keypatch即可。打包命令:

1
2
3
4
5
tar -cvf archive.tar file1 file2 directory
tar -czvf archive.tar.gz directory
tar -rvf archive.tar newfile

tar -xvf archive.tar

常见漏洞的patch方法

格式化字符串漏洞

  1. printf=>puts,直接改call的地址即可。风险是puts会在结尾添加换行,不一定能过检查。

  2. 强行调整参数。rdi放"%s",rsi放原参数。程序里有%s在的话会好一点,如果没有%s的话,我们可能要找3字节塞进去如下内容:

1
0x25 0x73 0x00== %s\0

但是指令也可能不够长?

UAF

“UAF就直接把free nop掉” ——某位大跌学长

check过程中没办法检查是否有free,所以直接nop掉free似乎是个不错的方案。反正也爆不了,内存就在那扔着你也不能怎么样

整数溢出

整数溢出比较简单,修改相应判断指令的跳转逻辑就行(?)将有符号跳转改为无符号?

缓冲区溢出

改小相关的输入长度,分x86和x64,写死的数值参数x86需要patch push指令,但是注意,在操作数大于0x100的时候push内容可能会变化,涉及到栈平衡的问题需要注意。
x64就直接patch寄存器赋值即可。

scanf的话尝试将"%s"改成"%ns"来限制输入长度,如果长度是动态的尝试了下改成read(0,buf,len)一般汇编也是够的

VM

核心是防止在vm指令执行过程中越界/非预期的读写,具体问题具体分析,肯定会有执行指令过程中的check漏洞

逻辑漏洞

nop漏洞分支(nop掉跳转指令)敏感函数的参数权限(如mmap等)

通防

给程序加沙箱直接无脑关闭execve调用,但是通防可能被检测,自行斟酌
https://github.com/TTY-flag/evilPatcher

测试下来,二进制文件大小没有变化,线下试试吧。

非预期?

程序如果exit退出,打io的话尝试nop掉exit或者改成_exit?

检查漏洞

敏感功能函数,strlen获取长度限制能不能塞满溢出,scanf%s的输入

docker命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker run -it -d -v host_path:container_path -p host_port:container_port --cap-add=SYS_PTRACE IMAGE_ID # auto update 自动执行update.sh脚本

docker run -it -d -v host_path:container_path -p host_port:container_port --cap-add=SYS_PTRACE IMAGE_ID /bin/sh # do not update 不会自动更新

docker run -it -d -v host_path:container_path -p host_port:container_port --privileged IMAGE_ID # privileged enabled and auto update 给特权标志和自动更新

docker run -it -d -v host_path:container_path -p host_port:container_port --privileged IMAGE_ID /bin/sh # privileged enabled and auto update 给特权标志和自动更新


docker run -it -d -v $PWD:/home/ctf/hacker

docker exec -it CONTAINER_ID /bin/sh
docker exec -it -u root CONTAINER_ID /bin/sh

/bin/test-this-container.sh
CATALOG
  1. 1. 环境问题
    1. 1.1. pwn题配置
  2. 2. 准备
  3. 3. 常见漏洞的patch方法
    1. 3.1. 格式化字符串漏洞
    2. 3.2. UAF
    3. 3.3. 整数溢出
    4. 3.4. 缓冲区溢出
    5. 3.5. VM
    6. 3.6. 逻辑漏洞
    7. 3.7. 通防
    8. 3.8. 非预期?
  4. 4. 检查漏洞
  5. 5. docker命令