这是一项任务,但我在基本理解方面遇到了问题。
易受攻击的代码:
int choc(char *arg)
{
char buf[400];
snprintf(buf, sizeof buf, arg);
return 0;
}
我知道 arg 需要是一个格式字符串,它将用我要执行的代码的地址覆盖返回地址。但是我在创建格式字符串时遇到了麻烦。
所以,格式字符串需要具备的东西:
- 返回指令的地址,我需要覆盖
- %x 的列表
- 我将在返回地址上写的值。这将是我要执行的代码的地址。
为了得到返回地址,我只需要查看gdb中'ret'指令的地址,对吗?%x 的目的到底是什么?以及如何在格式字符串中对要执行的代码的地址进行编码?
我做了一个测试:使用gdb我发现我的buf的地址是0xbffffba0。我生成 arg 为 "\xa0\xfb\xff\xbf_%x.%x.%n"; 这不应该在地址 0xbffffba0 的缓冲区的开头写入一些值吗?但是我得到一个段错误。我究竟做错了什么?
任何帮助,将不胜感激!