理解PE格式—找出导出表(Export Table)中的函数地址(ShellCode篇)

本文接上一篇: 看完理论,接着要来写代码实践一下。 要实现的功能是通过Inline Assembly 打开 C:\1.exe 先要获取kernel32.dll在内存中的基址,因为kernel32中有我需要的函数,有两种方法。 第一种方法(https://idafchev.github.io/exploit/2017/09/26/writing_windows_shellcode.html): 第二种方法(加密解密里的方法): 本文采用第一种方法。 基础版ShellCode: 程序就是找到kernel32.dll 然后找到导出表,遍历找到Function name Table 中WinExec的位置, 通过这个位置找到Ordinal Table中指定的index,通过这个index在 Address Table找到 WinExec的地址,然后传参,call这个地址。 进阶版ShellCode: 进阶版ShellCode用了加密解密中的Hash算法找Function Name,防止被检测到。 终极版(加密解密版) 程序的功能是从http://ll.com/1.exe下载并执行。ll.com可以在etc\hosts里做映射。 只是核心代码的思路和加密解密一样,区别是我把数据直接在汇编代码里push了。 先获取7个Kernel32的函数地址,再获取Urlmon的函数地址,放到栈里,最后通过ebp调用所需要的函数。 编译(MinGW): 关于这里的Hash算法可以参考这篇: 用PEstudio查看终极版编译出的程序,可以看到Import table里没有记录相关的函数。 从而更加隐蔽。 这里插一句,前一阵子听到某个同事说了一句话“MD5加密算法”,这里要说明一下MD5,MD4,SHA256都属于Hash算法,Hash算法是用来做快速查询的,由于算法的特性,几乎不可逆,所以不能说是加密算法。 吐槽一下,加密解密真的是不舍得在代码里写备注,看的累死人了。真不适合新手看。