首页 > 缓冲区溢出 > ShellCode常用的GetPC方法

ShellCode常用的GetPC方法

GetPC,也即Get Program Counter,取得程序计数器的值,在x86下就是GetEIP了,其作用是在进程的内存空间中得到当前的EIP的值,通常用于需要对代码自身进行操作的场合下,比如自解码和自修改代码(更一般的来说常见于病毒、溢出攻击代码等,也称之为代码重定位技术)。因为在x86下无法直接操作EIP寄存器,所以需要一些特殊的方法来获取EIP寄存器的值。

1. CALL GetPC
最简单的GetPC方法是使用call指令,之前的文章有提到过(http://www.programlife.net/miscellanies.html):

    call	@F
@@:
    pop		eax

编译之后就是下面这个样子:

0040105D      E8 00000000   call    00401062
00401062      58            pop     eax               ;  eax = 0x00401062

看上去很简单也很完美,但实际上却存在一个很明显的不足,就是E8后面跟了4个0×00,在很多场合下NULL字符是不应该出现的(比如字符串中),所以需要再进行改进。变换的方法有很多,这里举例说明一下(参考Conficker/Kido ShellCode):

0040105D      E8 FFFFFFFF     call    00401061
00401062      C2 58

E8 FFFFFFFF先跳转到第四个FF上面,然后把00401062压入栈中,然后第四个FF和后面的C2解析为INC EDX,58就是POP EAX,所以EAX的值就是00401062。
Call GetPc Null Free
2. FSTENV GetPC
在文章以Win32 bind port shellcode(4444 tcp) 399 bytes及文章一个字节毁掉一段ShellCode中均有提到,

00C67000 D9 EE            fldz             
00C67002 D9 74 24 F4      fnstenv     [esp-0Ch] 
00C67006 5B               pop         ebx

上述代码中ebx可以得到D9字节的地址(00C67000),唯一的不足就是栈顶数据会被破坏,如果栈中的数据不可以被破坏则需要恰当处理。
3. SEH GetPC
注册一个SEH处理函数,然后触发异常,在处理函数中获取发生异常的EIP值?
(当前没有找到一个清晰的示例代码,暂时略过。但是说这种方法只在XP下凑效,受操作系统的影响,不得意采用……)


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> ShellCode常用的GetPC方法
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. thugfs
    2014年11月19日08:39 | #1

    博客不错,持续关注中,希望能从博主那里多学到点东西。

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.