diff --git a/manticore/core/cpu/abstractcpu.py b/manticore/core/cpu/abstractcpu.py index e0c7e48..aaf2bf9 100644 --- a/manticore/core/cpu/abstractcpu.py +++ b/manticore/core/cpu/abstractcpu.py @@ -552,6 +552,21 @@ class Cpu(Eventful): result.append(Operators.CHR(self.read_int(where + i, 8))) return result + def write_string(self, where, string, max_length=None): + ''' + Writes a string to memory, appending a NULL-terminator at the end. + :param int where: Address to write the string to + :param str string: The string to write to memory + :param int max_length: + The size in bytes to cap the string at, or None [default] for no + limit. This includes the NULL terminator. + ''' + + if max_length is not None: + string = string[:max_length-1] + + self.write_bytes(where, string + '\x00') + def read_string(self, where, max_length=None): ''' Read a NUL-terminated concrete buffer from memory. diff --git a/manticore/platforms/linux.py b/manticore/platforms/linux.py index bb062b4..f332d82 100644 --- a/manticore/platforms/linux.py +++ b/manticore/platforms/linux.py @@ -1029,6 +1029,34 @@ class Linux(Platform): except OSError as e: return e.errno + def sys_getcwd(self, buf, size): + ''' + getcwd - Get the current working directory + :param int buf: Pointer to dest array + :param size: size in bytes of the array pointed to by the buf + :return: buf (Success), or 0 + ''' + + try: + current_dir = os.getcwd() + length = len(current_dir) + 1 + + if size > 0 and size < length: + logger.info("GETCWD: size is greater than 0, but is smaller than the length" + "of the path + 1. Returning ERANGE") + return -errno.ERANGE + + if not self.current.memory.access_ok(slice(buf, buf+length), 'w'): + logger.info("GETCWD: buf within invalid memory. Returning EFAULT") + return -errno.EFAULT + + self.current.write_string(buf, current_dir) + logger.debug("getcwd(0x%08x, %u) -> <%s> (Size %d)", buf, size, current_dir, length) + return length + + except OSError as e: + return -e.errno + def sys_lseek(self, fd, offset, whence): ''' lseek - reposition read/write file offset