阅读实验手册,开始做Attacklab.
CTARGET Phase 1
第一个Attack Phase要求调用存在的函数touch1.这个简单,自需要将touch1的首地址覆盖栈中的返回地址就行。
首先使用gdb调试ctarget,反汇编出getbuf的汇编代码:
可以发现这里分配了0x28(十进制是40)Bytes的栈帧。由于栈是低地址方向增长的,所以只要在%rsp+40的位置存入touch1的起始地址就好。通过反汇编touch1的代码,不难发现touch1的起始地址是0x4017c0:
所以构造字符串,前40个字节随意(但是不能取0A,因为0A是换行符,ctarget程序根据换行符判定输入结束),然后后面跟上0x4017c0(注意此时要转换为小端法表示):
保存为phase1.txt。
输入命令判题:
Phase1通过。
Phase 2
Phase2要求注入一小段代码,带参数调用touch2(unsigned)函数。
首先在实验手册里看到touch2需要判断一下你的cookie:
这个cookie是程序生成的一个随机数,在启动ctarget程序时有显示。
反汇编touch2函数,发现touch2函数的首地址是0x4017ec:
准备将代码注入到getbuf的栈帧里,实验手册已经说了ctarget的栈地址是固定的,这就方便了注入代码。在gdb调试下发现栈帧地址是0x5561dc78:
先罗列一下已有的信息:
Stack Address:0x5561dc78
function touch2 address:0x00000000004017ec
Cookie:0x59b997fa
然后开始写注入的代码。写的这段代码的目的是为了带参调用touch2.
fun2:
movl $0x59b997fa,%edi
pushq $0x4017ec
ret
汇编出目标文件,再使用objdump -d反汇编到phase2.txt:
phase2.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <fun2>:
0: bf fa 97 b9 59 mov $0x59b997fa,%edi
5: 68 ec 17 40 00 pushq $0x4017ec
a: c3 retq
保留二进制部分,补全40个字节,然后在后面附加上返回到栈帧的地址,
得到文件phase2.txt:
bf fa 97 b9 59 /* movl $0x59b997fa,%edi */