55 typedef struct pidmap {
56 atomic_t nr_free;
57 void *page;
58 } pidmap_t;
59
60 static pidmap_t pidmap_array[PIDMAP_ENTRIES] =
61 { [ 0 ... PIDMAP_ENTRIES-1 ] = { ATOMIC_INIT(BITS_PER_PAGE), NULL } };
Run Code Online (Sandbox Code Playgroud)
上面的代码片段显示了我在Linux内核源代码中找到的结构数组的初始化.我之前从未见过这种形式的初始化,我无法自己模拟同样的事情.我到底错过了什么?
get_cpu_var marcro,定义如下
29 #define get_cpu_var(var) (*({ \
30 extern int simple_identifier_##var(void); \
31 preempt_disable(); \
32 &__get_cpu_var(var); }))
Run Code Online (Sandbox Code Playgroud)
似乎是不可理解的.我假设它是一种函数宏,它返回一个变量指针(基于星号)或者它是某种函数指针.我甚至接近它?有人能启发我吗?
看一下"Shellcoder的手册"中的一些汇编和反汇编代码,我发现指令的序列操作数是不一样的.
例如,在组装时:
mov ebx,0
Run Code Online (Sandbox Code Playgroud)
并且,在拆卸时:
mov 0,ebx
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
如果确保kernel32.dll被加载到进程虚拟内存中,为什么我不能在不包含windows.h的情况下调用Sleep这样的函数?以下是来自vividmachine.com的摘录
那么,窗户呢?如何找到所需DLL函数的地址?每个Service Pack升级都不会改变这些地址吗?
有很多方法可以找到需要在shellcode中使用的函数的地址.有两种解决功能的方法; 您可以在运行时找到所需的功能或使用硬编码的地址.本教程将主要讨论硬编码方法.唯一保证映射到shellcode地址空间的DLL是kernel32.dll.这个DLL将保存LoadLibrary和GetProcAddress,这两个函数需要获取可以映射到漏洞进程空间的任何函数地址.但是这种方法存在问题,地址偏移量将随着Windows的每个新版本(服务包,补丁等)而改变.因此,如果您使用此方法,则shellcode仅适用于特定版本的Windows.进一步阅读部分将在本文末尾引用进一步的动态寻址.