Coder Jozu

I believe --- 这里坚持原创,拒绝转贴

  VC知识库BLOG :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 登录 ::
  13 随笔 :: 4 文章 :: 87 评论 :: 1 Trackbacks
<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

留言簿(4)

随笔分类

随笔档案

文章分类

文章档案

东接西链

搜索

最新评论

阅读排行榜

评论排行榜

定位自己:
__asm {
    fldz
    fnstenv byte ptr [esp-0ch]
    pop ebx
}

防止出现0x00的相对偏移跳转:
    push 0FFFFFFEBh
JMPOUT    $-4
    db    NEXT - JMPOUT - 1
    call JMPOUT
    jmp end
NEXT:
    .......
end:
posted on 2005-03-10 16:49 Coder Jozu 阅读(4274) 评论(12)  编辑 收藏

评论

# 看不懂@@ 2005-03-10 22:49 ksl
如题

# 定位自己 2005-03-11 10:08 周星星
__declspec(naked) void* me() // 我的方法,比较传统
{
__asm {
mov eax, [esp]
sub eax, 5
ret;
}
}

int main( int x )
{
void* p1;
__asm { // 仍然是你的方法,但修改了一点点
fldz
fnstenv byte ptr [esp-1ch]
mov eax, [esp-10h]
mov p1, eax
}

void* p2 = me();

return 0;
}

# 防止出现0x00的相对偏移跳转 2005-03-11 10:31 周星星
实在看不懂,从 -4-1 来看,似乎想构造一个CALL/JMP的跳转指令,而且 push 0FFFFFFEBh 中的 EB 是 CALL/JMP指令 的头,有大嫌疑,不过连在一起还是毫无头绪。


# re: NB代码,赶紧记下来 2005-03-11 10:40 Jozu
me()这种方法是最长用于病毒体定位自己的,等同于这个:
begin:
call next
next:
pop ebp
sub ebp, next-begin
这时ebp就是begin的位置,这个方法有个致命缺点就是指令中含有0,对于远程堆栈缓冲区溢出攻击来说是不能用的,所以采用这个方法。


# re: NB代码,赶紧记下来 2005-03-11 11:02 Jozu
这里有个很酷的技巧,再看一次:
push 0FFFFFFEBh
JMPOUT    $-4
    db    NEXT - JMPOUT - 1
    call JMPOUT
    jmp end
NEXT:
    .......
end: 
在call jmpout的时候,jmp end指令的位置已经放入了堆栈,也就是说我可以在这里放数据,字符串,等等。最关键的是这些数据里没有一个0,做一个
push 0FFFFFFEBh
JMPOUT    $-4
    db    NEXT - JMPOUT - 1
相当于作了一个jmp NEXT,然而下面的call的相对便宜位置变成了负数。

# to Jozu: 2005-03-11 15:08 周星星
你数次提到“指令中含有0”“数据里没有一个0”,请问为什么指令中含有0了就不能进行缓冲区溢出攻击?

# 首先还是要对栈溢出有一个大概的了解 2005-03-11 16:02 Jozu
void foo(char* src)
{
char buff[any_length];
strcpy(buff, src); // 这里是一个典型的缓冲溢出
}
攻击代码就写在src里面,那么如果攻击代码里面含有0,strcpy就不能把你的攻击代码完全拷贝下来。

# re: NB代码,赶紧记下来 2005-03-11 16:42 紫水晶
一头雾水~

# re: NB代码,赶紧记下来 2005-03-11 18:13 问题男
好文,但似乎有个小问题,不过我想多半应该是我没有完全领悟,还请指教

前一段代码重点是第二条语句fnstenv,获取fpu的当前状态,其中在32为保护模式下,第3个(从第0个开始)dword就是上一条“FPU Instruction Pointer Offset”。前面一条指令还可以用很多浮点指令替代

第二段楼主已解释了
push 0FFFFFFEBh机器码是
68 EBFFFFFF
此条指令后的$ - 4指向eb这个字节,给与标号JMPOUT,并初始化为NEXT - JMPOUT - 1,我的不解就在这里,不应该替换eb把?源代码是否应改成:
   push 0FFFFFFEBh
JMPOUT    $-3
    db    NEXT - JMPOUT - 1
    call JMPOUT
    jmp end
NEXT:
    .......
end: 
应该是$-3才能使JMPOUT指向eb的下一个字节(要替换的应该是这个才对吧),构造eb xx,组成jmp next的效果吧?

还请不吝赐教

# re: NB代码,赶紧记下来 2005-03-11 18:29 问题男
是这样:
push 0FFFFFFEBh 
JMPOUT    $-4
    db    0ebh
    db    NEXT - JMPOUT - 1 
    call JMPOUT 
    jmp end 
NEXT: 
    ....... 
end:


# re: NB代码,赶紧记下来 2005-03-11 18:40 问题男
就相当于:
__asm
{
  _emit   0x68;
JMPOUT:
  _emit   0xeb;
  _emit   0x09;      // 修正为 NEXT - JMPOUT - 2
  _emit   0xff;
  _emit   0xff;
  call    JMPOUT;
  jmp     end
NEXT:
  xor     eax, 0;
END:
}


# re: NB代码,赶紧记下来 2005-12-21 19:08 Ghostex
根据通常的溢出攻击原理,如果有零,目标程序就会认为想要收取的数据到此结束,所以在此之后的代码是无法进入目标程序的。而一段不完整的代码是肯定得不到预期结果的。

个是陋见,还请指教 :)

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]