| | [Tags | | | 16, 32, 64, i386, indy, ldt, linux, modify_ldt, poc, wasm, x86_64 | ] | 
 Я уже, как-то пользовался подобной фичей, а тут умница Indy (я ведь не ошибаюсь, Danilova на васме - это он?), напомнил. В результате получился вот такой кодик:
 
        BITS    32
        global  main
        extern  printf, exit
main:   push    0x003eafcc
        push    0x100
        push    L1
        push    0
        mov     eax, 123
        mov     ebx, 1
        mov     ecx, esp
        mov     edx, 16
        int     0x80
        add     esp, edx
        xor     eax, eax
        cdq
        jmp     7:0
L1:     mov     edx, 0xc88cffff
        db      0x66, 0xea
        dd      L2
        jae     L2
L2:     push    edx
        push    eax
        push    format
        call    printf
        add     esp, 8
        push    0
        call    exit
format  db      "EAX=%08x EDX=%08x", 10, 0
EAX=7 EDX=FFFF
Для тех, кто в танке, можно и подробнее: 
main:   push    0x003eafcc      ; 32:0 T:2 R-X:1 G:0 NP:0 U:1
        push    0x00000100      ; limit
        push    L1              ; base
        push    0               ; entry
..................
L1:
        BITS    16
        mov     dx, 0xffff
        mov     ax, cs
        jmp     dword 115:L2
L2:     BITS    32Ага?
P.S. Привет дизассемблерам и кривоэмуляторам. Indy - respect.UPD. Чтобы жизнь медом не казалась, переходим на x64:
 
L1:     BITS    16
        mov     ax, 20
        int     0x80
        mov     dx, 0xffff
        mov     ax, cs
        jmp     dword 0x23:L2
.............................
        add     esp, 8
        jmp     0x33:L3
L3:     mov     al, 60
        mov     di, 13
        syscall
$ strace ./a.out
execve("./a.out", ["./a.out"], [/* 26 vars */]) = 0
[ Process PID=19183 runs in 32 bit mode. ]
....
modify_ldt(0x1, 0xffe28ddc, 0x10)       = 0
Unknown value CS=0x07 while detecting personality of process PID=19183
getpid()                                = 19183
....
[ Process PID=19183 runs in 64 bit mode. ]
 |