1.intel_syntax noprefix
2
3.global _start
4_start:
5    mov ebp, esp
6    sub ebp, 0x4000
7    mov edx, ebp
8
9    lea esi, [self_modifying]
10    mov edi, ebp
11    mov ecx, 0x2d
12    call memcpy
13    add ebp, 0x2d
14    xor ebx, ebx
15    call edx
16
17    mov eax, 1
18    int 0x80
19
20memcpy:
21    cmp ecx, 0
22    je _end
23    dec ecx
24    mov al, byte ptr [esi+ecx]
25    mov byte ptr [edi+ecx], al
26    jmp memcpy
27
28_end:
29    ret
30
31self_modifying:
32    inc ebx
33    call $+5
34    pop esi
35    dec byte ptr [esi+11]
36    xor edx, edx
37    sub esi, 6
38_loop_start:
39    cmp edx, 5
40    jz _loop_end
41
42    mov edi, ebp
43    mov ecx, 0x2d
44    lea eax, [memcpy]
45    call eax
46    inc edx
47    add ebp, 0x2d
48    mov byte ptr [ebp], 0xc3
49    jmp _loop_start
50
51_loop_end:
52