Final
The levels to be exploited can be found in the /opt/protostar/bin directory.
The /proc/sys/kernel/core_pattern is set to /tmp/core.%s.%e.%p.
Final 0¶
You may wish to use a toupper() proof shellcode
gets
不处理\0
,而strlen
通过\0
来计算字符串的长度,因此可以通过前置\0
来绕过toupper
-
Core files will be in /tmp
核心转储文件(man core
)The default action of certain signals is to cause a process to terminate and produce a core dump file, a disk file containing an image of the process's memory at the time of termination.
-
常见 Signal 如下
Signal Action Comment SIGINT Term Interrupt from keyboard SIGILL Core Illegal Instruction SIGSEGV Core Invalid memory reference -
首先通过缓冲区溢出来获得核心转储文件用于调试并确定溢出点
-
也可以通过进程调试
-
查看 ret2libc 函数地址
-
观察如何构造栈来正确地调用
execve()
-
获取
/bin/sh
在 libc 中的偏移 -
查看 libc 的起始地址
Exploit¶
Final 1¶
The ‘already written’ bytes can be variable, and is based upon the length of the IP address and port number.
-
正确使用
login
后可以在/var/log/syslog
中看到登录尝试日志
-
看上去似乎没有可控制的
printf
,但syslog
类似于printf
,第二个参数为格式化字符串,因而可以通过username
和pw
来控制,接下来可以修改strncmp
函数 GOT 表的条目地址 -
获取
strncmp
函数 GOT 表的条目地址 -
获取
system
函数的地址-
On a real modern system you would first have to leak addresses from memory in order to calculate offsets and break ASLR
-
-
观察输入字符串在栈中的位置
-
最短
hostname
为x.x.x.x:x
(长度为 \(9\)),最长hostname
为xxx.xxx.xxx.xxx:xxxxx
(长度为 \(21\)),为了对齐,需要进行填充,根据hostname
的长度范围可以统一填充到 \(24\) 字节,这样一来就可以固定写入第 \(17\) 个参数所指向的地址 -
接下来查看已打印字符数量,并确定剩余需要字符的数量
Exploit¶
Final 2¶
Remote heap level :)
- 输入字符串应满足以下条件
- 以
FSRD
开头,总长度为 128 字节 - 包含
/
和子串ROOT
- 以
-
在当前工作目录/当前用户家目录下创建
.gdbinit
,写入每次启动gdb
时希望执行的命令 -
重点关注
check_path
,利用/
查找和memmove
修改堆,并借助free
完成unlink
攻击Dump of assembler code for function check_path
-
查看堆的起始地址
-
因为本身分配的 chunk 大小即大于
MAX_FAST_SIZE
,因而在释放第一个 chunk 时,若下一个 chunk 未被使用,将进行unlink
,利用函数check_path
修改第二个 chunk -
在执行
free
之后,可作为修改 GOT 表条目的目标函数为write
和strlen
(选择write
)Dump of assembler code for function get_requests
-
与 Heap 3 不同,需要获得 shell,又因为有
BK->fd
写回,\(8\) 字节不足以放下所有 shellcode,可利用jmp
,使用 Online Assembler and Disassembler 转换为 shellcode