首页
社区
课程
招聘
[求助]同样是 jge 指令,怎么差这么多。。
发表于: 2007-8-6 14:18 6676

[求助]同样是 jge 指令,怎么差这么多。。

2007-8-6 14:18
6676
程序a中
//25行:           cmp esi, 3
0040DB82 83 FE 03             cmp         esi,3
//26行:           jge yyy
0040DB85 7D 10                jge         yyy (0040db97)

可以看到 jge yyy 的机器码是 7D 10

程序b中
//99行:           cmp esi, 100
004010DC 83 FE 64             cmp         esi,64h
//100行:          jge yyy
004010DF 0F 8D F8 00 00 00    jge         yyy (004011ef)

这里jge yyy 的机器码是  0F 8D 06 01 00 00 ,为什么会和a程序的jge差这么多?

a程序是这样
int main(int argc, char* argv[]){
        int i=0;
        __asm{
        xxx:
                mov esi, i
                cmp esi, 3
                jge yyy
        }
        printf("print \n"); // b程序这里还执行了一些其他代码
        i++;
        __asm{
                jmp xxx
        yyy:
        }

        return 0;
}

b程序
__asm{
xxx:
        mov esi, i
        cmp esi, 100
        jge yyy
}

    hProcess = OpenProcess(1040, 0, processid[i]);
    if (hProcess){
          EnumProcessModules(hProcess, &hModule, sizeof(hModule), pBytesReturned);
          GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
          GetShortPathName(path, path, 256);

          memcpy(aj+offset, path, strlen(path));//把所有进程名字都放到一个aj数组里
          offset+=strlen(path);
    }
    i++;
__asm{
        jmp xxx
yyy:
}

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
2
0F8x 是 jxx near,跳转范围大
7X 是 jx short,只有+-127字节
2007-8-6 14:27
0
雪    币: 196
活跃值: (96)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
哇哈哈 多谢版主,原来这样,我是在学写shellcode,代码里用到一个for循环,循环里的东西太长超过127字节就会用 jxx near指令,碰到jxx near的话就会有0x00导致shellcode中断,我把它改成这样了
__asm{
xxx:
                mov esi, i
                cmp esi, 100
                jge aaaa
        }

        hProcess = OpenProcess(1040, 0, processid[i]);
                __asm{
aaaa:
                        mov esi, i
                        cmp esi, 100
                        jge bbb
                }
        if (hProcess){
            EnumProcessModules(hProcess, &hModule, sizeof(hModule), pBytesReturned);
                        __asm{
bbb:
                                mov esi, i
                                cmp esi, 100
                                jge ccc
                        }
            GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
                        __asm{
ccc:
                                mov esi, i
                                cmp esi, 100
                                jge ddd
                        }
            GetShortPathName(path, path, 256);
__asm{
ddd:
                                mov esi, i
                                cmp esi, 100
                                jge eee
                        }

                        memcpy(aj+offset, path, strlen(path));
                        offset+=strlen(path);
                        __asm{
eee:
                                mov esi, i
                                cmp esi, 100
                                jge yyy
                        }
        }

                i++;
        __asm{

        jmp xxx
yyy:
        }

这么改只是为了避免jxx near指令带来的0x00,不知道有没有好点的办法,这样看起来别扭。。
2007-8-6 15:17
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
4
1. 你的shellcode不能直接调用API
2. 避免00可以精心选择一些指令写一个loader
2007-8-6 17:11
0
雪    币: 196
活跃值: (96)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
这样啊,我再去研究下, 多谢版主~
2007-8-6 17:48
0
雪    币: 196
活跃值: (96)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
把函数用汇编写的话,有个问题,怎么push数组的第 i 个元素
比如        
hProcess = OpenProcess(1040, 0, processid[i]);
这句,要写成汇编的话怎么写?
__asm{
  push ?? //这里如何push?

  push 0
  push 1040
  mov eax, 0xYYYYYYYY //OpenProcess地址
  call eax
}
2007-8-6 18:08
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
7
lea eax,processid
push DWORD ptr [eax+xxx] ;xxx为下标
2007-8-6 18:30
0
雪    币: 196
活跃值: (96)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
欧也 非常感谢~
2007-8-6 19:13
0
游客
登录 | 注册 方可回帖
返回
//