type
status
date
slug
summary
tags
category
icon
password
这个比赛的质量还可以吧,整体不算太难,3个栈题,1个堆题。堆体很简单,那3个栈题考的都比较好。
最有希望ak的一次,可惜有一道线程的那道,最开始眼瞎了,没注意有fmt(格式化字符串),卡了很久,后面线程那也是看了半天猜出来的,结果后面就没时间了。比赛结束10多分钟出了。
然后第一道shellcode那道,完全没接触过,后面找到工具了,结果运行不起来,只好放弃。
宁外两题到没什么困难。
多说无意直接来看wp。
beverage_store
一道栈题,比较有趣。
一开始有个输入密码的地方,用时间做随机数种子,生成随机数,直接套板子就行。
后面有个跟据输入的数据寻找位置,修改地址内容的地方。虽然限制大小小于4,但可以输入负数于是就可以往后修改数据。正常可以修改的为section

就可以修改
exit@got.plt
里面的值为这个函数起始地址,使程序循环执行。然后随便修改上面的libc地址,使得程序把libc地址打印出来。再修改
printf@got.plt
里的值为system函数地址。最后修改 exit@got.plt
里面的值为后门函数地址(程序中有个 printf(/binn/sh)
),就行。exp
vtable_hijack
一道很简单的堆题,glibc2.23的版本。
有栈溢出和UAF,直接申请一个
unsortedbin
把libc地址泄露出来,然后创造一个fastbin链,把最后一个bin的fd指针修改到 malloc_hook
的上面(注意这个地址要满足chunk的样子,size要为0x70左右),然后把这个给修改后的地址申请出来,向 malloc_hook
里写ogg,就行。exp
Offensive_Security
这道题比较奇怪,直接看给的pwn文件没啥用,要看宁一个,具体使用的函数在另一个文件其中。
在一开始有个登录密码,这里有个格式化字符串漏洞,可以直接把程序中的随机数打印出来,并按照程序中对随机数的逻辑直接去ai一个脚本。

之后程序会开启两个进程,其中一个用于向某一个变量先输入随机数,然后再由我们向输入数据,并判断这两个数是不是相同的,如果相同则会进入一个栈溢出函数中。
另一个直接向变量中读入数据。这里两个进程使用的变量是相同的,这个进程读入的数据存放的地址就是上面一个进程的存放随机数的地址,并且没有锁。
因此我们在程序执行到这里的时候可以直接联系输入两次1,那么就可以把通过下面的进程把变量中的内容改为1,之后第二次在上面的进程中输入1,就可以绕过检测,直接来到栈溢出的地址。
之后就是正常的栈溢出流程,并且还可以靠之前的格式化字符串把libc的地址打印出来。
exp
Alpha_Shell
对于我来说这道题算是一道学到东西比较多的一道。
这道题的逻辑比较简单,在程序上开辟一段rwx地址,然后读取最多0x150的数据进去,然后程序跳转执行那个地址,从我们输入的地方开始执行。同时对读入的数据有一个检测,保证必须是可见字符(大小写字母和数字),并且还开启了沙箱。

这个沙箱算是我见过看的开的保护最多的沙箱,不但不能拿shell,甚至连read,write,open这几个函数也不让使用,我们只能重新找几个函数使用。
到这里这道题的思路基本就有了,我们要找几个不是read,write,open这几个函数的函数,构造shellcode,并且还要保证这个shellcode的内容都是大小写字母和数字。
当时我做的时候再理清这个之后尝试自己写了一下发现不行,直接写太复杂了。要用工具看看能不能辅助一下。
这道题其实再他的题目里就已经把做这道题要用的工具写出来了
Alpha
这个工具就用来专门把shellcode转换为全是大小写字母和数字的一个工具。就是这个工具,我也是第一次接触这个工具,当时做题的时候虽然找到了这个工具但不会用导致最后没有做出来,有点可惜了。
这个工具怎么用的可以参考这个文章,这里面写的比较详细
有一个比较扯淡的一点就是这个工具的运行环境是在python2的环境,我之前一直在python3的环境下干。我还说怎么起不来。
这道题可以直接用pwntools写openat和sendfile这两个函数写shellcode。
要用这个工具我们要先生成一个包含shellcode的文件,如上,文件名就是shell

这样就会生成一个叫shell的文件其中就有我们要用的shellcode,然后我们把这个文件拿到之前那个工具的文件夹之中。

按照之前的做法,现在我们还有找到一个寄存器,其中存放这shellcode的起始地址

此时我们可以看到在程序中有rdx和rdi中有起始地址
0x100000000
这里我们用rdi(rdx不知道为什么不行)。然后我们可以在之前工具那里执行如下的命令
x64-要64位的shellcode
ascii mixedcase-条件,数字+大小写字母
rdi-存放起始地址的寄存器
shell-文件名

这个就是符合条件的shellcode
我们可以直接把这个注入其中就行。

这个比赛整体来说不难,算是比较基础的题目,还是学到不少好东西的。
- 作者:wgiegie
- 链接:https://tangly1024.com/article/1563ecc9-5160-8024-b273-e70909d59f3b
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章