JuncoJet 发表于 2020-9-25 15:17

伪64位CM

本帖最后由 JuncoJet 于 2020-9-25 15:48 编辑


编写语言VB6+VC2005+NASM

solly 发表于 2020-9-26 12:36

JuncoJet 发表于 2020-9-25 22:31
我觉得这种伪64位好像有BUG
调试我没调,因为调不了……
不过编写时发现,我无论用 push pop rcx ...

可以取到高位值呀,我的测试代码如下:
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>


int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow) {

    MessageBox(0, L"start", L"test", MB_OK);

    char strs[] = "0123456789ABCDEF";
    long a = 0, b = 0, c = 0;

    __asm {
      push eax
      push ebx
      push ecx
      push edx
      push ebp
      lea edx, strs
      /// 注意修改ebp后不能使用前面定义的局部变量,要在修改前使用。
      mov ebp, esp       /// 保存esp
      xor eax, eax
      xor ecx, ecx
      mov ebx, x32code   /// get exit point
      push 0x33
      push offset x64code
      jmp far fword ptr ss:;
    x64code:
      //db 0x48, 0x8B, 0x02//MOV RAX, QWORD PTR DS:
      _EMIT 0x48
      _EMIT 0x8B
      _EMIT 0x02
      //db 0x48, 0x8B, 0xC8//MOV RCX, RAX   ;低32位
      _EMIT 0x48
      _EMIT 0x8B
      _EMIT 0xC8
      //db 0x48, 0xC1, 0xF8, 0x20 //SAR RAX, 32 ; 高32bit
      _EMIT 0x48
      _EMIT 0xC1
      _EMIT 0xF8
      _EMIT 0x20
      //db 0xC7, 0x44, 0x24, 0x04, 0x23, 0x00, 0x00, 0x00 //MOV DWORD PTR SS:, 0x23
      _EMIT 0xC7
      _EMIT 0x44
      _EMIT 0x24
      _EMIT 0x04
      _EMIT 0x23
      _EMIT 0x00
      _EMIT 0x00
      _EMIT 0x00

      //db 0x89, 0x1C, 0x24    ///MOV DWORD PTR SS:, EBX
      _EMIT 0x89
      _EMIT 0x1C
      _EMIT 0x24
      //db 0xFF, 0x2C, 0x24    ///JMP FAR FWORD PTR SS:
      _EMIT 0xFF
      _EMIT 0x2C
      _EMIT 0x24
    x32code:
      mov esp, ebp /// 恢复 esp
      pop ebp      /// 使用局部变量前恢复 ebp
      mov a, eax   /// 高32位
      mov b, ebx
      mov c, ecx   /// 低32位
      pop edx
      pop ecx
      pop ebx
      pop eax
    }

    WCHAR buffer;
    swprintf_s(buffer, L"eax = 0x%08X, ecx = 0x%08X", a, c);
    MessageBox(0, buffer, L"result", MB_OK);

    ExitProcess(0);

        return 0;
}

solly 发表于 2020-9-25 20:12

本帖最后由 solly 于 2020-9-25 20:45 编辑

是一个多解题:

汇编码:
xor rax,rax                           
push qword ptr ds:               
push qword ptr ds:            
pop rdx                              
pop rcx                              
or rcx,rdx                           
mov rdx,8771432856936762               
xor rcx,rdx                           
shl rdx,6                              
xor rcx,rdx                           
mov edx,8E34CA8D                     
cmp ecx,edx                           
jne $+3 ;(跳过 inc rax 指令)               
inc rax                              
xor rdx,rdx                           
xor rcx,rcx                           
mov dword ptr ss:,23            
mov dword ptr ss:,ebx            
jmp far fword ptr ss:
按两个 push 的长度算,中间有4字节重叠,按其计算结果,只要前4字符与后4字符重复,中间可以插入4个字符,中间4字符与前面4字符的 or 计算为 0xXXXXXXXX7C7E756F 即可,X为任何值,因为只有低32位比较,高32位无要求。
上面的我验证用的字符如下:
lTXXCavdlTXX

灰灰。 发表于 2020-9-25 18:09

改cs来切64执行64的汇编?

xjun 发表于 2020-9-25 19:36

题目为多解,提供一组pass: "ou~|ou~|"

条件:
比如输入12345678
rcx 低32位 为4个字符,v1 = 0x34333231
rdx低32为为4个字符, v2 = 0x38373635
满足 v1 or v2 = 0x7c7e756f 即可。

x64code:
00000000`1000105b 5a            pop   rdx
00000000`1000105c 59            pop   rcx
00000000`1000105d 4809d1          or      rcx,rdx
00000000`10001060 48ba6267935628437187 mov rdx,8771432856936762h
00000000`1000106a 4831d1          xor   rcx,rdx
00000000`1000106d 48c1e206      shl   rdx,6
00000000`10001071 4831d1          xor   rcx,rdx
00000000`10001074 ba8dca348e      mov   edx,8E34CA8Dh
00000000`10001079 39d1            cmp   ecx,edx

AmanoHina. 发表于 2020-9-25 20:40

大佬膜拜!!

JuncoJet 发表于 2020-9-25 22:31

本帖最后由 JuncoJet 于 2020-9-25 22:34 编辑

solly 发表于 2020-9-25 20:12
是一个多解题:

汇编码:

我觉得这种伪64位好像有BUG
调试我没调,因为调不了……
不过编写时发现,我无论用 push pop rcx
还是 mov rcx, 这样的,我都没法实际赋值64位数据

JuncoJet 发表于 2020-9-26 13:33

本帖最后由 JuncoJet 于 2020-9-26 13:36 编辑

solly 发表于 2020-9-26 12:36
可以取到高位值呀,我的测试代码如下:
#include
#include

我的意思是,指针的值,mov rbx,qword
你可以?难道是我写错了

solly 发表于 2020-9-26 13:46

本帖最后由 solly 于 2020-9-26 13:48 编辑

JuncoJet 发表于 2020-9-26 13:33
我的意思是,指针的值,mov rbx,qword
你可以?难道是我写错了
我第1条x64指令 MOV RAX, QWORD PTR DS:,就是你这个情况吧,可以读入8字节数据。
你那个是要写成 rsp ,不是esp吧

另外,取地址指针,要用 LEA 指令吧,不是 mov,mov rbx,qword也其实是取值。

sks2013 发表于 2020-9-26 15:53

学习了,厉害
页: [1] 2
查看完整版本: 伪64位CM