Chinaunix首页 | 论坛 | 博客
  • 博客访问: 164580
  • 博文数量: 36
  • 博客积分: 1466
  • 博客等级: 上尉
  • 技术积分: 380
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-17 17:43
文章分类

全部博文(36)

分类: 网络与安全

2008-07-23 11:30:34

shellcode之踏雪无迹心得

总结来说就是 1保存所有寄存器的值 2堆栈平衡 3不破坏上层栈桢的数据

一般eax, ebx, ecx, edx的值都是无关要紧的。但不是绝对,要根据上下面决定。esi, edi, ebp, esp就一定要恢复执行shellcode之前的值了。

通用的办法是shellcode一开始就抬高栈顶,之后pushad,再运行shellcode。一开始就抬高栈顶的原因是防止shellcode被压栈的数据覆盖。


还有要注意的是如果push一些字符串数据供函数调用,API是不会帮你清栈的,这时栈就不平衡了,所以要自己动手来清栈,之后才能popad.... so...会增加shellcode的长度。一般的代码如下
    xor ebx, ebx     
    mov bl, 020h      ;这里假设字符串数据和hash之类的占用020h个字节
    add esp, ebx

    popad             ;

    xor ebx, ebx
    mov bh, 040h      ;
    add esp, ebx


其它问题都解决了,还有一个麻烦的问题~~
返回到哪里?

如果发生溢出的函数只被一个地方调用问题很好办,但如果被多个函数调用的话。。。
当然可以通过逆向工程解决这个问题~~

还有返回地址位于exe上只要硬编码就万事无忧,但如果是DLL的话只好返回其基址,再加上RVA,PUSH其VA再RET了。。。


踏雪无迹只是理想境界,当缓冲区太小,不得不大面积覆盖上面函数的栈桢的时候,还是直接了当的ExitProcess吧。。。
阅读(1419) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~