ps: 阅读这本书籍,希望留下点什么~
__author__ == "lit0"
问题1: jmp esp定位
问题描述: jmp esp 是动态执行shellcode的关键,一般的,只需要执行内存任何jmp esp语句就可以跳转到esp指向的地址即shellcode地址使代码执行成功。
下面的代码是载入user32.dll 获取 jmp esp内存地址。
注意 jmp esp 的地址应该逆序写入 shellcode 如 0x7763fd21 >> 21 fd 63 77
# include<stdio.h>
# include<windows.h>
int main()
{
BYTE* ptr;
int position, address;
HINSTANCE handle;
BOOL done_flag = FALSE;
handle = LoadLibrary("user32.dll");
if (!handle) {
printf("load dll error");
exit(0);
}
ptr = (BYTE*)handle;
for (position = 0; !done_flag; position++) {
try {
// 0xffe4 是jmp esp 对应的机器码
if (ptr[position] == 0xFF && ptr[position+1] == 0xE4) {
int address = (int)ptr + position;
printf("found ad 0x%x\n", address);
}
} catch (...) {
int address = (int)ptr + position;
printf("end of 0x%x\n", address);
done_flag = true;
}
}
}
问题2:如何获取user32.dll MeassageBoxA的入口地址
问题描述: 使用dependency walker 获取user32.dll 的基址 由于位置原因win7 32 sp1 获取失败,只能读取到preferred base地址,actual base地址获取不了(和书本讲好的不一样呐~ 解决他花了好多时间。)
使用下面代码可以获取函数的入口地址:
# include<windows.h>
# include<stdio.h>
int main()
{
//获取函数调用的入口地址
HINSTANCE LibHandle;
LibHandle = LoadLibrary("kernel32.dll"); //可以替换 如:换成user32.dll
typedef void (*MYPROC)(LPTSTR);
MYPROC procAddr = (MYPROC)GetProcAddress(LibHandle, "ExitProcess"); //换成MessageBoxA
printf("0x%x\n",procAddr);
}