文章目录
- easy-ikun
- 四种方法
- black_ikun
- syscall-ikun
- ikun-runner_
- 记第一次校赛出题
- 如何运行服务器?
- 保存镜像
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运行-dp 12345:5000—privileges 镜像名
Nc localhost 12345
注意——privileged选项。你可以替换<tag>你想要什么都行。您可以将12345更改为您想要的任何端口。
保存镜像
sudo docker save 镜像名 > 镜像名.tar