第一届云南大学CTF校赛YNUCTF-PWN提示(hint)

easy-ikun

s[i:j] 表示获取a[i]到a[j-1]
s[:-1]去掉最后一个字符
s[:-n]去掉最后n个字符
s[-2:]取最后两个字符
s[i:j:k]这种格式呢,i,j与上面的一样,但k表示步长,默认为1
s[::-1]是从最后一个元素到第一个元素复制一遍(反向)

四种方法

Canary 设计为以字节 \x00 结尾,本意是为了保证 Canary 可以截断字符串。 泄露栈中的 Canary 的思路是覆盖 Canary 的低字节,来打印出剩余的 Canary 部分。 这种利用方式需要存在合适的输出函数,并且可能需要第一溢出泄露 Canary,之后再次溢出控制执行流程

对于 Canary,虽然每次进程重启后的 Canary 不同 (相比 GS,GS 重启后是相同的),但是同一个进程中的不同线程的 Canary 是相同的, 并且 通过 fork 函数创建的子进程的 Canary 也是相同的,因为 fork 函数会直接拷贝父进程的内存。我们可以利用这样的特点,彻底逐个字节将 Canary 爆破出来

已知 Canary 失败的处理逻辑会进入到 __stack_chk_failed 函数,__stack_chk_failed 函数是一个普通的延迟绑定函数,可以通过修改 GOT 表劫持这个函数

已知 Canary 储存在 TLS 中,在函数返回前会使用这个值进行对比。当溢出尺寸较大时,可以同时覆盖栈上储存的 Canary 和 TLS 储存的 Canary 实现绕过
注意以下这个

struct Game {
    char choice[100];
    long long int balance;
    long long int bet;
    int correct;
    int guess;
    int answer;
};

char [100];意味着只能存储100个字符。如果用户输入超过100个字符,则选择项将被覆盖,并且选择项下的变量(例如balance, bet)将被覆盖。因此,溢出即可

black_ikun

在这里插入图片描述
接受字节转换为整数为 int()
在这里插入图片描述
输入整数 发送用str(整数).encode()
在这里插入图片描述

syscall-ikun

可以看出此次仍然是一个栈溢出。类似于之前的做法,我们可以获得 v4 相对于 ebp 的偏移为 108。所以我们需要覆盖的返回地址相对于 v4 的偏移为 112。此次,由于我们不能直接利用程序中的某一段代码或者自己填写代码来获得 shell,所以我们利用程序中的 gadgets 来获得 shell,而对应的 shell 获取则是利用系统调用。关于系统调用的知识,请参考
系统调用
简单地说,只要我们把对应获取 shell 的系统调用的参数放到对应的寄存器中,那么我们在执行 int 0x80 就可执行对应的系统调用。比如说这里我们利用如下系统调用来获取 shell

ikun-runner_

这个程序中没有bug,但是运行用户输入shellcode是危险的,它实际上意味着用户可以在服务器中做任何事情(运行任何代码)。因此,这种类型的pwn挑战旨在测试ctf玩家制作shell代码以读取flag或生成shell的能力。
制作shellcode
我们可以很容易地通过汇编通过pwntools生成shellcode:
从PWN导入*

Assembly = " '
Mov x, 0x3b
Xor rsi, rsi
“‘
Shellcode = asm(assembly, 'amd64')

制作程序集来生成一个shell比制作程序集来读取标志文件更容易
要生成shell,我们需要系统调用。sycall是一个小型库函数,它调用系统调用,其汇编语言接口具有指定编号和指定参数。有一个名为execve的功能强大的系统调用,它可以让您执行任意命令,因此,如果您可以执行/bin/sh,就会生成一个shell。

记第一次校赛出题

FROM ubuntu:20.04 AS app

FROM pwn.red/jail
COPY --from=app / /srv
COPY YNU /srv/app/run
RUN chmod +x /srv/app/run
COPY flag.txt /srv/app/flag.txt

如何运行服务器?

确保您在包含Dockerfile(或change . conf)的目录中。到下面包含Dockerfile的目录)。

Docker build -t 镜像名 .

docker run -dp 12345:5000 --privileged 镜像名

Nc localhost 12345  

注意–privileged选项。您可以将12345更改为您想要的任何端口。

保存镜像

sudo  docker save 镜像名 > 镜像名.tar
  • 26
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看星猩的柴狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值