伪64位CM
本帖最后由 JuncoJet 于 2020-9-25 15:48 编辑编写语言VB6+VC2005+NASM
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: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 改cs来切64执行64的汇编? 题目为多解,提供一组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
大佬膜拜!! 本帖最后由 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:36 编辑
solly 发表于 2020-9-26 12:36
可以取到高位值呀,我的测试代码如下:
#include
#include
我的意思是,指针的值,mov rbx,qword
你可以?难道是我写错了 本帖最后由 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也其实是取值。 学习了,厉害
页:
[1]
2