我正在開發一個 C 專案,目標是訪問 Web 服務器,讀取檔案中的資料(例如 example.com/shellcode.bin)并將其存盤在陣列中。
目前,我設法發出了必要的 GET 請求,我可以找到我的 shellcode,將其插入到陣列(mycode)中,但是當我回傳它時,它給我發送了錯誤的大小。
例如,如果 sizeof(mycode) 回傳 270,則 sizeof(PE) 回傳 8。
是否可以找到 PE 變數的總大小?
size_t size = sizeof(mycode);
char* PE = (char*)malloc(size);
for (int i = 0; i < sizeof(mycode); i ) {
PE[i] = mycode[i];
}
printf("Shellcode size before return : %ld\n", sizeof(PE));
return PE;
我嘗試了不同的格式字串輸出(%s with strlen, %d, %ld, %zu ....)它們都回傳 8。
uj5u.com熱心網友回復:
一種解決方案是回傳一個包含指向緩沖區的指標和長度的結構。
// outside the function
typedef struct {
char* data;
size_t size;
} Buffer;
// in the function
Buffer buffer;
buffer.data = PE;
buffer.size = size;
return buffer;
并將回傳型別更改為Buffer.
uj5u.com熱心網友回復:
指標指向指向型別的單個物件;給定一個指標值,無法知道您是否正在查看序列的第一個物件。N指標中沒有元資料說“我指向的東西后面還有更多元素”。
sizeof PE給你指標變數的大小,而不是緩沖區中的東西的數量;sizeof PE == sizeof (char *). sizeof *PE為您提供單個 char物件的大小,根據定義為 1;sizeof *PE == sizeof (char).
您必須手動跟蹤您分配了多少記憶體 - 您必須以某種方式size在您打算使用的任何地方保留該變數PE。
正如其他人指出的那樣,您可以將其捆綁到一個struct型別中:
struct buffer {
size_t size;
char *PE;
};
struct buffer newBuf( const char *mycode, size_t size )
{
struct buffer b;
b.PE = calloc( size, sizeof *b.PE );
if ( b.PE )
{
memcpy( b.PE, mycode, size );
b.size = size;
}
return b;
}
int main( void )
{
char shellcode[] = { /* some char data here */ };
struct buffer b = newBuf( shellcode, sizeof shellcode );
...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/523667.html
上一篇:與用于列印值的字串指標的語法混淆
