OD: Shellcode / Exploit & DLL Trampolining
2014-04-11 07:35
302 查看
看到第五章了。
标题中 Dll Tramplining(跳板)名字是从如下地址找到的,写的很好:
http://en.wikipedia.org/wiki/Buffer_overflow#The_jump_to_address_stored_in_a_register_technique
Shellcode
exploit 是一个过程,其结果通常体现为一段代码,这段代码承载了 shellcode。exploit 用于生成攻击性的网络数据包或者其他形式的攻击性输入,其核心是淹没返回地址,劫持进程控制权,之后跳转执行 shellcode。
shellcode 有通用性,而 exploit 往往针对特定漏洞。如果说 exploit 是导弹,shellcode 则可以比喻成弹头。Metasploit 就充分利用了模块化和代码复用的思想,将 exploit 和 payload (shellcode) 分开。
Shellcode 需要解决的问题
1. 自动定位 shellcode 的起点。实际使用中,shellcode 经常被动态加载(特别是 IE)。
2. 填充数据的设计。(想到《The Art Of Exploitation》中提到过好多技巧,可惜细节忘差不多了)
3. 动态获取系统的 API 地址。
4. 对 shellcode 进行编码解码,突破 buffer 和 IDS 的限制。(又想到《TAOE》)
动态定位 Shellcode — 跳板原理
实际 exploit 过程中,由于 dll 的装入和卸载等原因,Windows 进程的函数栈帧经常会移位,如此一来,将返回地址设置成定值的方法就不通用。
注意到在一般情况下,ESP 中的地址问题指向系统栈中,且不会被溢出的数据破坏。函数返回时,ESP 所指的位置通常在返回地址的下一个位置,这就为跳板技术的实施开了条路。(需要注意,函数返回时 ESP 所指的位置与函数调用约定、返回指令有关,例如“retn 3”、“retn 4”之后,ESP 所指的位置是会有偏差)
View Code
存在问题:
1. 输出 exit() 的地址不定,一直变动,不知道为什么。
2. exit() 地址中含有的 0x00 还是不知道怎么输入 buffer
3. find esp 找到的 jmp esp 的地址不是通用的,怎么解决?
4. Denpendency Walker 算出的 MessageBoxA() 和 ExitProcess() 的地址和实际的还是不一样,不明白。
标题中 Dll Tramplining(跳板)名字是从如下地址找到的,写的很好:
http://en.wikipedia.org/wiki/Buffer_overflow#The_jump_to_address_stored_in_a_register_technique
Shellcode
原来,shellcode 这个词来源于一篇论文:1996 年 Aleph One 发表跨时代的《Smathing The Stack For Fun And Profit》,文中描述讲到利用基于栈的溢出向进程中植入一段用于获得 shell 的代码,并将植入的代码称为 Shellcode。后来 shellcode 被统一指代通过缓冲区溢出植入的代码。
exploit 是一个过程,其结果通常体现为一段代码,这段代码承载了 shellcode。exploit 用于生成攻击性的网络数据包或者其他形式的攻击性输入,其核心是淹没返回地址,劫持进程控制权,之后跳转执行 shellcode。
shellcode 有通用性,而 exploit 往往针对特定漏洞。如果说 exploit 是导弹,shellcode 则可以比喻成弹头。Metasploit 就充分利用了模块化和代码复用的思想,将 exploit 和 payload (shellcode) 分开。
Shellcode 需要解决的问题
1. 自动定位 shellcode 的起点。实际使用中,shellcode 经常被动态加载(特别是 IE)。
2. 填充数据的设计。(想到《The Art Of Exploitation》中提到过好多技巧,可惜细节忘差不多了)
3. 动态获取系统的 API 地址。
4. 对 shellcode 进行编码解码,突破 buffer 和 IDS 的限制。(又想到《TAOE》)
动态定位 Shellcode — 跳板原理
实际 exploit 过程中,由于 dll 的装入和卸载等原因,Windows 进程的函数栈帧经常会移位,如此一来,将返回地址设置成定值的方法就不通用。
1998 年,黑客组织“Cult of the Dead Cow”的 Dildog 在 Bugtrq 邮件列表中以 Microsoft Netmeeting 为例首次提出了利用 jmp esp 完成对 shellcode 的动态定位,从而解决了 Windows 下栈帧移位问题给开发稳定 exploit 带来的重重困难。毫不夸张地讲,跳板技术是 Windows 栈溢出利用技术的一个里程碑。
注意到在一般情况下,ESP 中的地址问题指向系统栈中,且不会被溢出的数据破坏。函数返回时,ESP 所指的位置通常在返回地址的下一个位置,这就为跳板技术的实施开了条路。(需要注意,函数返回时 ESP 所指的位置与函数调用约定、返回指令有关,例如“retn 3”、“retn 4”之后,ESP 所指的位置是会有偏差)
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<windows.h> #define PASSWORD "1234567" int verify_password(char *password) { int authenticated=0x03050709; char buffer[44]; // add local buf to be overflowed authenticated=strcmp(password,PASSWORD); strcpy(buffer, password); // overflow here return authenticated; } int main() { int valid_flag=0; char password[1024]; //LoadLibrary("c:\\windows\\system32\\user32.dll"); // for messagebox LoadLibrary("user32.dll"); // for messagebox //MessageBoxA(0,"LoadLibrary user32.dll seccess.","Message",0); if(!freopen("password.txt","r",stdin)) //FILE *fp; //if(!(fp=fopen("password.txt","rw+"))) { printf("file open error!\n"); exit(0); } scanf("%s",password); //fscanf(fp,"%s",password); printf("password input: %s\n",password); valid_flag=verify_password(password); if(valid_flag){ printf("Incorrect password!\n\n"); } else { printf("Congratulation! You have passed the verification!\n\n"); } //fclose(fp); return 0; }
View Code
存在问题:
1. 输出 exit() 的地址不定,一直变动,不知道为什么。
2. exit() 地址中含有的 0x00 还是不知道怎么输入 buffer
3. find esp 找到的 jmp esp 的地址不是通用的,怎么解决?
4. Denpendency Walker 算出的 MessageBoxA() 和 ExitProcess() 的地址和实际的还是不一样,不明白。
相关文章推荐
- OD: Universal Shellcode
- Exploit,shellcode经验技巧谈
- 【实战】Exploit,shellcode经验技巧杂谈
- MyBB <= 1.8.2 unset_globals() Function Bypass and Remote Code Execution(Reverse Shell Exploit) Vulnerability
- Tiny Download&&Exec ShellCode
- Exploit writing tutorial part 2 : Stack Based Overflows – jumping to shellcode
- OD: Heap Exploit : DWORD Shooting & Opcode Injecting
- OD: Writing Small Shellcode
- shell-code-3-echo用法&printf用法
- OD: Shellcode Encoding
- OverFlow/Exploit/ShellCode
- 运行shell脚本提示“syntax error near unexpected token for((i=0;i<$length;i++))”
- Codeforces Round #281 (Div. 2) C. Vasya and Basketball&D. Vasya and Chess
- spark on yarn 报 org.apache.hadoop.util.Shell$ExitCodeException: 问题
- 12 Source Code Profilers for C & C++
- 【Python】Visual Studio Code 安装&&使用 hello python~~~~
- keeps the bar green to keep the code clean" - JUNIT单元测试
- shell重定向(大于号,小于号,左右,2>&1,&)
- EntityFramework 6.0< Code First > 连接 Mysql数据库
- BZOJ_1798_&_Codevs_2216_[AHOI_2009]_行星序列_(线段树)