1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
|
/* This is bytecode inserted on the stack of the attached application. */
/* When you modify it, check that the length is dword-aligned. */
.equ SYS_open, 5
.equ SYS_close, 6
.equ SYS_getpid, 20
.equ SYS_kill, 37
.equ SYS_dup, 41
.equ SYS_ioctl, 54
.equ SYS_dup2, 63
.equ O_RDWR, 02
.equ TCGETS, 0x5401
.equ TCSETS, 0x5402
.equ SIGWINCH, 28
.equ sizeof_termios, 60
.file "attach.S"
.text
attach:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
pusha
push %ebp
mov %esp, %ebp
sub $sizeof_termios, %esp
mov $SYS_open, %eax
mov 0x24(%ebp), %ebx
mov $O_RDWR, %ecx
int $0x80
push %eax /* fd of the terminal */
mov $SYS_dup, %eax
cervena:
mov $0x0, %ebx
int $0x80
push %eax /* old stdin */
mov $SYS_dup, %eax
zelena:
mov $0x1, %ebx
int $0x80
push %eax /* old stdout */
mov $SYS_dup, %eax
modra:
mov $0x2, %ebx
int $0x80
push %eax /* old stderr */
mov $SYS_close, %eax
fialova:
mov $0x0, %ebx
int $0x80
mov $SYS_close, %eax
oranzova:
mov $0x1, %ebx
int $0x80
mov $SYS_close, %eax
bezova:
mov $0x2, %ebx
int $0x80
mov 0xc(%esp), %ebx /* pts fd */
mov $SYS_dup2, %eax
zluta:
mov $0x0, %ecx
int $0x80
mov $SYS_dup2, %eax
bila:
mov $0x1, %ecx
int $0x80
mov $SYS_dup2, %eax
cerna:
mov $0x2, %ecx
int $0x80
/* From now on, NO %esp MANIPULATION PERMITTED!
We will look back at the stack from the retty process. ;-) */
mov $SYS_ioctl, %eax
mov (%esp), %ebx
mov $TCGETS, %ecx
lea -sizeof_termios(%ebp), %edx
int $0x80
mov $SYS_ioctl, %eax
hnusna:
mov $2, %ebx
mov $TCSETS, %ecx
lea -sizeof_termios(%ebp), %edx
int $0x80
mov $SYS_ioctl, %eax
mov 0x4(%esp), %ebx
mov $TCGETS, %ecx
lea -sizeof_termios(%ebp), %edx
int $0x80
mov $SYS_ioctl, %eax
cokoladova:
mov $1, %ebx
mov $TCSETS, %ecx
lea -sizeof_termios(%ebp), %edx
int $0x80
mov $SYS_ioctl, %eax
mov 0x8(%esp), %ebx
mov $TCGETS, %ecx
lea -sizeof_termios(%ebp), %edx
int $0x80
mov $SYS_ioctl, %eax
vanilkova:
mov $0, %ebx
mov $TCSETS, %ecx
lea -sizeof_termios(%ebp), %edx
int $0x80
mov $SYS_close, %eax
mov 0xc(%esp), %ebx
int $0x80
mov $SYS_getpid, %eax
int $0x80
mov %eax, %ebx
mov $SYS_kill, %eax
mov $SIGWINCH, %ecx
int $0x80
nop
leave
popa
/* The value will be rewritten */
add $0x12000000, %esp
ret
|