RCTF shellcoder 一道很烦人的pwn题
TOC
这道题的靶机是没有execve
系统调用的,而且没有glibc库,flag要靠自己手写汇编来读取。
所有文件下载:shellcoder.zip 。
提示
who likes singing, dancing, rapping and shell-coding? |
安全防护
ex@Ex:~/test$ checksec shellcoder |
程序介绍
主函数
int __cdecl main(int argc, const char **argv, const char **envp) |
这里申请了一块可以执行的内存,但是只给我们读入7个字节
。
sub_48B
sub_48B proc near |
这里会清空环境,然后执行我们输入那7个字节
。
分析
- 考验构造shellcode的能力
- 考验手写汇编的能力
- 考验对系统调用的了解
构造shellcode
这个还是比较简单的,相对于后面的两个考验来说。
下面的shellcode就能用7个字节来完成我们的shellcode扩展:
mov dl,255 |
由于大部分寄存器都清零了,所以我们可以直接把它当成SYS_read
系统调用来用,然后注入我们的新shellcode。
但是,出题人并没有把题目出的这么简单,因为靶机的SYS_execve
系统调用是被禁用了,而且如题目所示,出题人把flag藏了起来,需要我们把flag找出来。
寻找flag
下面代码的功能是从输入流读取文件夹名,然后对文件夹进行解析,最后把解析的内容输出到输出流。
如果想仔细了解这些系统调用的使用,可以参考这篇文章:Linux-手写汇编,用系统调用来读取文件夹和文件 。
mov dl,255 |
深度优先遍历
利用深度优先遍历算法进行搜索。
find_flag.py:
#!/usr/bin/python2 |
最后找到我们的flag地址为./flag/rrfh/lmc5/nswv/1rdr/zkz1/pim9/flag
。
读取flag
知道路径之后就可以写shellcode来读flag了:
push rsi |
下面这段脚本的作用就是利用上面得出的flag路径来读取flag。
#!/usr/bin/python2 |
运行实例
[+] Opening connection to 139.180.215.222 on port 20002: Done |
总结
一道很烦的题,主要考验我们的汇编功底。