Tag: 安全

如何从终端编译这个简单的shellcode c程序?

我试图使用ubuntu 12上的终端编译它: #include #include main() { /*declare argument array*/ char *args[2]; args[0] = “/bin/bash”; args[1] = NULL; execve(args[0], args, NULL); exit(0); } 我在http://www.securitytube.net/video/235上找到了这个例子,这也恰好是’Smashing the Stack for Fun and Profit’中使用的一个Aleph One。 我知道自那以后发生了很多变化。 在我使用的更简单的例子中: gcc -ggdb -mpreferred-stack-boundary = 2 -fno-stack-protector filename filename.c 其他时候我可能包括静态实用程序。 它一直在努力,直到我试图编译上面的C代码。 我从终端收到的消息是: ss@ss-laptop:~$ gcc -static -mpreferred-stack-boundary=2 -fno-stack-protector -o shell shell.c shell.c: In function ‘main’: […]

字节编码function时的分段错误?

当我运行以下C程序(在Ubuntu中使用gcc编译)时,我遇到了分段错误。 #include char f[] = “\x55\x48\x89\xe5\x48\x89\x7d\xf8\x48\x89\x75\xf0\x48\x8b\x45\xf8\x8b\x10\x48\x8b\x45\xf0\x8b\x00\x89\xd1\x29\xc1\x89\xc8\xc9\xc3”; int main() { int (*func)(); func = (int (*)()) f; int x=3,y=5; printf(“%d\n”,(int)(*func)(&x,&y)); return 0; } 字符串f包含以下函数的机器代码。 int f(int*a, int*b) { return *a-*b; } CF: fo: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 : 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 48 89 7d […]

C中的乘法溢出

我正在做一些安全性CTF练习,并且遇到了这个问题。 这是已编译程序的C源代码: int main(int i, long **a) { if(*a[1] * 0x1064deadbeef4601u == 0xd1038d2e07b42569u) //exec shell return 0; } 困扰我的事情: 当我关闭gcc标志时,长**主参数将无法编译,因此我无法在计算机上重现问题。 这是一个使用不同的编译器吗? 编译程序在CTF服务器上运行正常。 在测试相等性之前,程序在乘法过程中反复溢出。 我尝试使用线性同余方程(mod 2 ^ 64)和扩展的欧几里德算法来找到所需的x输入,但这对我不起作用。 有人可以帮我解决这个问题吗? 我试图找到* a [1],正确的程序参数。 在gdb中反汇编主要给出: (gdb) disas main Dump of assembler code for function main: 0x000000000040050c : push %rbp 0x000000000040050d : mov %rsp,%rbp 0x0000000000400510 : sub $0x10,%rsp 0x0000000000400514 […]

安全处理字符串变量

你好,我对C很陌生,简而言之,我在课堂作业中做了以下工作: foo (char *var) { printf(var); } 我被告知这是不好的做法和不安全但我的导师没有得到关于此的详细信息。 我假设如果var的字符串值可由用户控制,它可能用于执行缓冲区溢出? 我如何正确强化此代码? 我是否必须限制str长度? 干杯谢谢!

在assembly中实施AES

大家好我正在尝试构建一个代码来演示在汇编中进行AES加密。 最新的英特尔手册 AESENC xmm1,xmm2 / m128 -Perform来自第二个源操作数的一轮AES加密流轮密钥,对来自第一个源操作数的128位数据(状态)进行操作,并将结果存储在目标操作数中。 AESENCLAST xmm1,xmm2 / m128 -Perform最后一轮AES加密流来自第二个源操作数的循环密钥,对来自第一个源操作数的128位数据(状态)进行操作,并将结果存储在目标操作数中。 AESKEYGENASSIST xmm1,xmm2 / m128,imm8通过计算生成加密轮密钥的步骤,使用源操作数中指定的128位数据和指定为立即存储的8位循环常量,帮助扩展AES密码密钥目标操作数中的结果。 要做到这一点,我将尝试在线组装,我将构建它来比较在C中完成的普通AES的速度! 我的第一次头脑风暴让我想到如何在内联汇编中使用xmm任何有关我的probs的帮助/头脑风暴/分享想法或一般的想法欢迎干杯=)

有关libc指针加密的问题

glibc和eglibc有一个PTR_MANGLE ,它可以加密可写内存中的指针(更准确地说,’XOR’而不是’encrypt’)。 我没有太多关于这个function的阅读。 man -k PTR_MANGLE没有回复,谷歌正在回复一些肤浅的喋喋不休。 Drepper在Live Journal上的Pointer加密是为数不多的权威文章之一。 有没有深入的文件? 它可以扩展到用户空间进程,还是仅限于运行时库? 如果是,启用该function的编译器开关或选项是什么? 可以在运行时禁用该function吗?

安全的跨平台function,以获得规范化的路径

我想要一个将相对路径转换为绝对路径的标准函数,如果可能的话,我想尽可能使它成为跨平台(所以我想避免调用外部库函数)。 这样做是为了防止路径攻击。 我知道这样的函数不能检测符号链接,但我对我的应用程序没问题。 我可以推出自己的代码,但可能存在一些问题,例如平台如何处理“../”模式的编码或变体。 有没有已经实现的东西?

Windows上的缓冲区溢出攻击导致访问冲突

我刚开始研究缓冲区溢出攻击是如何工作的,并尝试使用Visual C 2010模拟对Windows 7的攻击。缓冲区溢出攻击是非常人为的,它只是将返回地址覆盖到“缓冲区”局部变量的地址。 缓冲区包含shellcode字符串。 无论我是否在Visual Studio 2010 Debug中运行程序,程序都会跳转到shellcode并几乎开始执行它,但是我遇到了Access Violation错误,程序将不会继续执行shellcode。 为什么我收到此错误? 这是对Windows中缓冲区溢出的某种保护吗? 你如何让程序在缓冲区中执行shellcode? 编辑: 汉斯(回答)是对的。 这在Windows Internals 5th的安全章节中讨论,错误的原因是Microsoft的可执行空间保护的实现。 如果这个问题对任何人都有帮助,那么任何赞成票都会受到赞赏 void execute_my_shellcode() { char buffer[24]; memcpy(buffer, “\x6A\x21\xFF\x15\x40\x62\x40\x00\x83\xC4\x04\x6A\x0A\xFF\x15\x40\x62\x40\x00\x83\xC4\x04\xC3”, 24); printf(“current return address: %p\n”, *(int*)((char*)&buffer + 24 + 4)); *(int*)((char*)&buffer + 24 + 4) = (int)&buffer; printf(“return address is now : %p\n\n”, (int*)*(int*)((char*)&buffer + 24 + 4) ); […]

C:IFS系统()漏洞

出于教育原因,我必须利用C代码 程序首先设置egid,然后设置system(“/usr/bin/…”);的漏洞system(“/usr/bin/…”); 命令。 所以我在我的主目录中创建了一个’usr’,并将路径设置为Home PATH=$HOME:$PATH 我想将bash中的IFS变量更改为/: export IFS=’/’ 不幸的是,当我打电话给C-Programm时:我的漏洞利用不起作用 有人能告诉我出了什么问题吗?

Microsoft SDL和memcpy弃用

正如你们中的一些人可能知道的那样, 微软从他们的安全开发生命周期中取消了memcpy() ,将其替换为memcpy_s() 。 void *memcpy(void *dest, const void *src, size_t n); /* simplified signature */ errno_t memcpy_s(void *dst, size_t dstsize, const void *src, size_t n); 因此,如果您的代码曾经是: if (in_len > dst_len) { /* error */ } memcpy(dst, src, in_len); 它成为了: if (memcpy_s(dst, dst_len, src, src_len)) { /* error */ } 或者,截断, memcpy(dst, src, min(in_len, dst_len)); […]