diff --git a/c/meterpreter/source/extensions/stdapi/server/fs/dir.c b/c/meterpreter/source/extensions/stdapi/server/fs/dir.c index c671d289..e2718fc9 100644 --- a/c/meterpreter/source/extensions/stdapi/server/fs/dir.c +++ b/c/meterpreter/source/extensions/stdapi/server/fs/dir.c @@ -2,21 +2,11 @@ #include "fs_local.h" -void request_fs_ls_cb(void *arg, char *name, const char *dir) +void request_fs_ls_cb(void *arg, char *name, char *path) { Packet *response = arg; - char path[FS_MAX_PATH]; struct meterp_stat s; - /* - * Build the full path if we have a base directory - */ - if (dir) { - _snprintf(path, sizeof(path), "%s%c%s", dir, FS_SEPARATOR, name); - } else { - _snprintf(path, sizeof(path), "%s", name); - } - /* * Add the file name, full path and stat information */ diff --git a/c/meterpreter/source/extensions/stdapi/server/fs/file.c b/c/meterpreter/source/extensions/stdapi/server/fs/file.c index 026c3be1..a3b7e256 100644 --- a/c/meterpreter/source/extensions/stdapi/server/fs/file.c +++ b/c/meterpreter/source/extensions/stdapi/server/fs/file.c @@ -207,7 +207,7 @@ DWORD request_fs_separator(Remote *remote, Packet *packet) { Packet *response = packet_create_response(packet); - packet_add_tlv_string(response, TLV_TYPE_STRING, FS_SEPARATOR_S); + packet_add_tlv_string(response, TLV_TYPE_STRING, FS_SEPARATOR); packet_add_tlv_uint(response, TLV_TYPE_RESULT, ERROR_SUCCESS); diff --git a/c/meterpreter/source/extensions/stdapi/server/fs/fs_local.h b/c/meterpreter/source/extensions/stdapi/server/fs/fs_local.h index 6e3369eb..e66a7876 100644 --- a/c/meterpreter/source/extensions/stdapi/server/fs/fs_local.h +++ b/c/meterpreter/source/extensions/stdapi/server/fs/fs_local.h @@ -5,13 +5,11 @@ #include <stdio.h> #ifdef _WIN32 -#define FS_SEPARATOR '\\' -#define FS_SEPARATOR_S "\\" -#define FS_MAX_PATH 32768 +#define FS_SEPARATOR "\\" +#define FS_MAX_PATH 32768 #else -#define FS_SEPARATOR '/' -#define FS_SEPARATOR_S "/" -#define FS_MAX_PATH PATH_MAX +#define FS_SEPARATOR "/" +#define FS_MAX_PATH PATH_MAX #endif /* @@ -38,7 +36,7 @@ struct meterp_stat { uint64_t st_ctime; }; -typedef void (* fs_ls_cb_t)(void *arg, char *name, const char *path); +typedef void (*fs_ls_cb_t)(void *arg, char *name, char *path); int fs_chdir(const char *directory); diff --git a/c/meterpreter/source/extensions/stdapi/server/fs/fs_posix.c b/c/meterpreter/source/extensions/stdapi/server/fs/fs_posix.c index ccf3e3e1..c6064677 100644 --- a/c/meterpreter/source/extensions/stdapi/server/fs/fs_posix.c +++ b/c/meterpreter/source/extensions/stdapi/server/fs/fs_posix.c @@ -13,6 +13,7 @@ int fs_ls(const char *directory, fs_ls_cb_t cb, void *arg) { struct meterp_stat s; struct dirent *data; + char path[FS_MAX_PATH]; DIR *ctx = opendir(directory); if (ctx == NULL) { @@ -20,7 +21,10 @@ int fs_ls(const char *directory, fs_ls_cb_t cb, void *arg) } while ((data = readdir(ctx))) { - cb(arg, data->d_name, directory); + + snprintf(path, sizeof(path), "%s/%s", directory, data->d_name); + + cb(arg, data->d_name, path); } closedir(ctx); diff --git a/c/meterpreter/source/extensions/stdapi/server/fs/fs_win.c b/c/meterpreter/source/extensions/stdapi/server/fs/fs_win.c index 18a8ba75..10fe1733 100644 --- a/c/meterpreter/source/extensions/stdapi/server/fs/fs_win.c +++ b/c/meterpreter/source/extensions/stdapi/server/fs/fs_win.c @@ -115,19 +115,35 @@ int fs_ls(const char *directory, fs_ls_cb_t cb, void *arg) WIN32_FIND_DATAW data; wchar_t *path_w = utf8_to_wchar(expanded); if (path_w == NULL) { - result = ERROR_NOT_ENOUGH_MEMORY; + result = GetLastError(); goto out; } HANDLE ctx = FindFirstFileW(path_w, &data); + if (ctx == NULL) { + result = GetLastError(); + goto out; + } + do { if (ctx == INVALID_HANDLE_VALUE) { result = GetLastError(); break; } + /* + * Build the full path if we have a base directory + */ char *filename = wchar_to_utf8(data.cFileName); - cb(arg, filename, baseDirectory); + char path[FS_MAX_PATH]; + + if (baseDirectory) { + _snprintf(path, sizeof(path), "%s\\%s", filename, baseDirectory); + } else { + _snprintf(path, sizeof(path), "%s", data.cFileName); + } + + cb(arg, filename, path); free(filename); } while (FindNextFileW(ctx, &data)); @@ -138,7 +154,6 @@ int fs_ls(const char *directory, fs_ls_cb_t cb, void *arg) FindClose(ctx); free(expanded); out: - free(tempDirectory); free(baseDirectory); free(path_w); return result;