执行 Shellcode¶
介绍¶
shellcode 是一段用于利用软件漏洞而执行的代码,shellcode 为16进制之机械码,以其经常让攻击者获得 shell 而得名。shellcode 常常使用机器语言编写。 可在暂存器 eip 溢出后,塞入一段可让 CPU 执行的 shellcode 机械码,让电脑可以执行攻击者的任意指令。在编译时关闭 ASLR、NX 、CANARY 选项,这样就可以在输入时把 shellcode 布置在栈中,通过动态调试获得所需要的 padding 溢出到返回地址为输入的 shellcode 地址,这样程序返回后便会执行 shellcode。
示例¶
下面给出一个经典例子,验证程序溢出后执行 shellcode,编译的环境为 winxp 工具为 vc6.0。
#include <stdio.h> #include <windows.h> #define PASSWORD "1234567" int verify_password(char *password) { int authenticated; char buffer[50]; authenticated = strcmp(password,PASSWORD); memcpy(buffer,password,strlen(password)); return authenticated; } void main() { int valid_flag =0; char password[1024]; FILE *fp; LoadLibrary("user32.dll"); if (!(fp=fopen("password.txt","rw+"))) { exit(0); } fscanf(fp,"%s",password); valid_flag = verify_password(password); if (valid_flag !=0) { printf("incorrect password!\n\n"); } else { printf("Congratulation! You have passed the verification!\n"); } fclose(fp); getchar(); }
编译完成后拖入 OllyDbg 动态调试确定 padding 的长度,在 memcpy 处下一个断点方便随后调试。可以先生成50 BYTES 的 padding 比较与返回地址的距离,最后确定为60 BYTES 后为返回地址。
输入的字符串会被复制到栈中 0012FAE4 的位置。
因为通过合理的 padding 控制了返回地址到 0012FAE4,所以在函数返回时寄存器 EIP 的值为 0012FAE4,这时系统会认为栈中的数据为机器码,程序就会执行地址为 0012FAE4 的代码。
password.txt 中的内容为精心布置的机器码,功能是弹出一个消息框,内容为 hackhack。如何编写 password.txt 中的内容,我们放在后面的章节来讲,本章着重介绍整个执行流程。
如我们所期望的,程序返回后执行了弹窗功能。