ssp_leak
当程序栈溢出检查失败触发__chk_stack_fail
函数时,会有一个
abort
出现。
abort
后面的值是argv
的指针数组指向的内容。
argv[0]
通常指向程序中的可执行文件的文件名。在有些版本的编译器中还包括程序文件所在的路径。
所以当我们把argv
数组覆盖成某个指定的地址,就可以获得这个地址的内容
源码
void __attribute__ ((noreturn))
__stack_chk_fail (void) {
__fortify_fail ("stack smashing detected");
}
void
__attribute__ ((noreturn))
__fortify_fail (msg)
const char *msg; {
/* The loop is added only to keep gcc happy. */
while (1)
__libc_message (2, "*** %s ***: %s terminated\n", msg, __libc_argv[0] ?: "<unknown>")
}
libc_hidden_def (__fortify_fail)
思路
函数流程
- 输入一个
name
,造成缓冲区溢出。 - 再次从用户处获取输入,覆盖
data
段的flag
保护措施
- FORTIFY 详情
是一种检测和预防某些缓冲区攻击的保护措施。编译器用某些方法预先知道了缓冲区的大小,__*_chk
就会在运行的的时候知道这个缓冲区是否溢出。
ELF重映射
当可执行文件足够小的时候,他的不同区段可能在内存中被多次映射,所以当其中一个损坏,还是有机会找到另一处存储着相同的内容。
在这里我们可以找到另外一个存flag
的地方。
0x400d20
这个地方就是重映射,没有被覆盖。
但是本地打不出来。
exp
1 |
|