Tag: cast

ctypes:投射字符串function?

我正在阅读文章在笔测试期间躲避反病毒的提示,并对给定的Python程序感到惊讶: from ctypes import * shellcode = ‘\xfc\xe8\x89\x00\x00….’ memorywithshell = create_string_buffer(shellcode, len(shellcode)) shell = cast(memorywithshell, CFUNCTYPE(c_void_p)) shell() shellcode缩短了。 有人可以解释发生了什么吗? 我熟悉Python和C,我尝试过阅读ctypes模块,但还有两个主要问题: 什么存储在shellcode ? 我知道这与C有关(在文章中它是来自Metasploit的shellcode,并且选择了不同的ASCII符号),但是我无法确定它是否是C源(可能不是)或源自某种编译(哪一个?)。 根据第一个问题,演员阵容中发生了什么?

为什么将“extern puts”转换为函数指针“(void(*)(char *))&puts”?

我正在查看来自不安全编程的示例abo3.c ,并且我没有在下面的示例中讨论转换。 有人可以开导我吗? int main(int argv,char **argc) { extern system,puts; void (*fn)(char*)=(void(*)(char*))&system; char buf[256]; fn=(void(*)(char*))&puts; strcpy(buf,argc[1]); fn(argc[2]); exit(1); } 那么 – 系统和投放的铸造是什么? 他们都返回一个int所以为什么把它变成无效? 我非常感谢对整个计划的解释。 [编辑] 谢谢你们的投入! Jonathan Leffler ,实际上代码有“坏”的原因。 它应该是可利用的,溢出缓冲区和函数指针等.mishou.org有一篇关于如何利用上述代码的博客文章。 其中很多仍然在我头上。 bta ,我从上面的博客文章中得知,转换系统会以某种方式阻止链接器删除它。 有一点不能立即明确的是系统和放置地址都写在同一个位置,我想这可能是gera所说的“因此链接器不会删除它”。 虽然我们讨论的是函数指针的主题,但现在我想问一个后续问题,即语法更清晰。 我正在使用函数指针查看一些更高级的示例,偶然发现这个令人厌恶的例子,取自托管shellcode的站点。 #include char shellcode [] =“some shellcode”; int main(void) { fprintf(stdout,“长度:%d \ n”,strlen(shellcode)); (*(void(*)())shellcode)(); } 所以数组被强制转换为返回void的函数,引用并调用? 这看起来很讨厌 – 所以上面代码的目的是什么? [/编辑]

在没有双精度类型的C编译器上解析双精度IEEE浮点

我正在使用8位AVR芯片。 64位double没有数据类型(double只映射到32位float)。 但是,我将通过串口接收64位双打,并且需要通过串行输出64位双打。 如何在不进行转换的情况下将64位双精度转换为32位浮点数并再次返回? 32位和64位的格式都遵循IEEE 754.当然,我假设转换为32位浮点时精度会下降。 为了从64位转换为32位浮点数,我正在尝试这样做: // Script originally from http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1281990303 float convert(uint8_t *in) { union { float real; uint8_t base[4]; } u; uint16_t expd = ((in[7] & 127) <> 4); uint16_t expf = expd ? (expd – 1024) + 128 : 0; u.base[3] = (in[7] & 128) + (expf >> 1); u.base[2] = […]

C-> C ++在#define中自动将void指针转换为C ++中的Type指针,如果没有给出类型(C风格)

嗨! 我使用了以下C宏,但在C ++中,它无法自动将void*为type* 。 #define MALLOC_SAFE(var, size) { \ var = malloc(size); \ if (!var) goto error; \ } 我知道,我可以这样做: #define MALLOC_SAFE_CPP(var, type, size) { \ var = (type)malloc(size); \ if (!var) goto error; \ } 但我不想重写使用MALLOC_SAFE大部分代码。 有没有办法在没有给宏的类型的情况下这样做? 也许一些MSVC 2005 #pragma / __declspec / other? ps:我不能使用C编译器,因为我的代码是大项目的一部分(数百个模块之一)。 而现在它是在C ++上。 我知道,我可以单独构建我的代码。 但这是旧代码,我只是想快速移植它。 问题是关于void * cast;)如果不可能,我只需用MACRO_SAFE_CPP替换MACRO_SAFE 谢谢!

在C中将双精度转换为整数时处理溢出

今天,我注意到当我将一个大于最大可能整数的double转换为整数时,我得到-2147483648。 类似地,当我转换一个小于最小可能整数的double时,我也得到-2147483648。 是否为所有平台定义了此行为? 在/溢出下检测此问题的最佳方法是什么? 在演员之前将if语句放入min和max int是最佳解决方案吗?

用C / C ++将int转换为bool

我知道在C和C ++中,当将bool转换为int时, (int)true == 1和(int)false == 0 。 我想知道反向投射…… 在下面的代码中,以下所有断言都适用于使用Visual Studio 2013和KeilμVision编译的.c文件5.注意(bool)2 == true 。 C和C ++标准对于将非零,非一个整数转换为bool的说法是什么? 是否指定了此行为? 请包括引用。 #include #include void TestBoolCast(void) { int i0 = 0, i1 = 1, i2 = 2; assert((bool)i0 == false); assert((bool)i1 == true); assert((bool)i2 == true); assert(!!i0 == false); assert(!!i1 == true); assert(!!i2 == true); } 不是重复我可以假设(bool)true ==(int)1对于任何C […]

严格别名和内存对齐

我有性能关键代码,并且有一个巨大的函数,在函数开始时在堆栈上分配40个不同大小的数组。 这些arrays中的大多数必须具有一定的对齐性(因为这些arrays是使用需要内存对齐的cpu指令(对于Intel和arm CPU)在链中的其他位置访问的。 由于某些版本的gcc无法正确对齐堆栈变量(特别是对于arm代码),或者甚至有时它表示目标体系结构的最大对齐小于我的代码实际请求的对齐,我别无选择,只能分配这些数组在堆栈上并手动对齐它们。 因此,对于每个数组,我需要做类似的事情才能使它正确对齐: short history_[HIST_SIZE + 32]; short * history = (short*)((((uintptr_t)history_) + 31) & (~31)); 这样, history现在在32字节边界上对齐。 对所有40个数组执行相同的操作非常繁琐,而且这部分代码实际上是cpu密集型的,我根本无法对每个数组执行相同的对齐技术(这种对齐混乱会使优化器混淆并且不同的寄存器分配会降低函数的使用时间,为了更好的解释,请参阅问题末尾的解释)。 所以…显然,我只想做一次手动对齐,并假设这些数组一个接着一个。 我还为这些数组添加了额外的填充,以便它们总是32个字节的倍数。 那么,我只需在堆栈上创建一个jumbo char数组并将其转换为包含所有这些对齐数组的结构: struct tmp { short history[HIST_SIZE]; short history2[2*HIST_SIZE]; … int energy[320]; … }; char buf[sizeof(tmp) + 32]; tmp * X = (tmp*)((((uintptr_t)buf) + 31) & (~31)); 这样的事情。 也许不是最优雅的,但它产生了非常好的结果,并且生成的组件的手动检查certificate生成的代码或多或少是足够的和可接受的。 构建系统已更新为使用更新的GCC,突然我们开始在生成的数据中有一些工件(例如,即使在具有禁用的asm代码的纯C构建中,validation测试套件的输出也不再精确)。 调试问题花了很长时间,它似乎与别名规则和更新版本的GCC有关。 那么,我该怎么做呢? […]

传递文件描述符 – 执行(类型转换)

我想知道如何通过execve命令传递文件描述符,然后在另一端访问它。 我知道我可以使用dup2重定向文件描述符,但我不能这样做。 我需要实际将文件描述符传递给子进程并在子进程中使用它。 到目前为止我所拥有的: Parent使管道+ args如下: int pfd[2]; if(pipe(pfd) == -1) exitWithError(“PIPE FAILED”, 1); char *args_1[] = {“reader”, argv[1], (char*) pfd, (char *) 0}; 然后孩子像叉子一样调用execve: close(pfd[1]); execve(“./reader”, args_1, NULL); 然后,在读者程序中,我尝试访问传递的管道描述符: int main(int argc, char* argv[]){ … write(argv[2][1], buf, read_test); ^^ argv [2]应该引用管道描述符,然后[1]应该转到管道的写端。 我几乎肯定我需要在这里做一些不同的类型转换,但我尝试的一切都不太合适。 – 注意::我有一个这个程序的工作版本,使用dup2重定向到孩子的stdin和stdout,但是我必须按照项目的指示将管道描述符传递给子节点。 任何帮助表示赞赏。

将2个char转换为1个int

我有2个字符:HIGH和LOW,我想把它们转换成一个对应HIGH的int +来自LOW的2个左位。 我试过像以下一样: unsigned char high; unsigned char low; high = 128; // 10000000 low= 128; // 10000000 int result; (should be high 10000000 + 2 left bites of low 10 = 1000000010) // To do return result; 编辑更清晰。 我选择的解决方案是: return high*4 + (low >> (CHAR_BIT – 2));

为什么要转换为指针然后取消引用?

我正在通过这个例子,它有一个函数输出一个hex位模式来表示任意浮点数。 void ExamineFloat(float fValue) { printf(“%08lx\n”, *(unsigned long *)&fValue); } 为什么要取fValue的地址,转换为无符号长指针,然后取消引用? 是不是所有的工作都等同于直接转换为无符号长? printf(“%08lx\n”, (unsigned long)fValue); 我试过了,答案不一样,很困惑。