|
@@ -36,10 +36,6 @@ ALIGNMODE k8
|
36
|
36
|
|
37
|
37
|
section .data
|
38
|
38
|
|
39
|
|
- bf_start_head:
|
40
|
|
- push 0x00400085
|
41
|
|
- ;dw 0x6885004000
|
42
|
|
- bf_start_head_sz: equ $ - bf_start_head
|
43
|
39
|
bf_start:
|
44
|
40
|
jmp .start
|
45
|
41
|
.mremap: ; rbx is resize size
|
|
@@ -187,7 +183,6 @@ section .data
|
187
|
183
|
|
188
|
184
|
bf_loopstart:
|
189
|
185
|
mov rbx, strict qword 0x1
|
190
|
|
- add rbx, [rsp]
|
191
|
186
|
xor rdx, rdx
|
192
|
187
|
mov dl, [rsi]
|
193
|
188
|
cmp dl, 0
|
|
@@ -198,7 +193,6 @@ section .data
|
198
|
193
|
|
199
|
194
|
bf_loopend:
|
200
|
195
|
mov rbx, strict qword 0x1
|
201
|
|
- add rbx, [rsp]
|
202
|
196
|
xor rdx, rdx
|
203
|
197
|
mov dl, [rsi]
|
204
|
198
|
cmp dl, 0
|
|
@@ -213,184 +207,41 @@ section .data
|
213
|
207
|
syscall
|
214
|
208
|
bf_exit_sz: equ $ - bf_exit
|
215
|
209
|
|
216
|
|
- elf_head: dw 0x457f, 0x464c, 0x0102, 0x0001,
|
217
|
|
- times 4 dw 0x0
|
218
|
|
- ; 0x10
|
219
|
|
- dw 0x0002, 0x003e, 0x0001, 0x0000
|
220
|
|
- dw 0x080, 0x040, 0x0, 0x0
|
221
|
|
- ; 0x20
|
222
|
|
- dw 0x0040
|
223
|
|
- times 3 dw 0x0
|
224
|
|
- elf_section_head_offset : times 8 db 0xFF ; 0x28
|
225
|
|
- ; 0x30
|
226
|
|
- dw 0x0, 0x0, 0x40, 0x38, 0x1, 0x40, 0x3, 0x2
|
227
|
|
- ; 0x40 section header
|
228
|
|
- dw 0x1, 0x0, 0x5 ; load in memory with RX perm
|
229
|
|
- times 5 dw 0x0
|
230
|
|
- ; 0x50
|
231
|
|
- dw 0x0, 0x40, 0, 0, 0, 0x40, 0, 0 ; load at 0x40000
|
232
|
|
- ; 0x60
|
233
|
|
- elf_prog_sz: times 16 db 0xFF ; 0x60 & 0x 68
|
234
|
|
- ; 0x70
|
235
|
|
- dw 0x0, 0x20
|
236
|
|
- times 6 dw 0x0
|
237
|
|
- elf_head_sz: equ $ - elf_head
|
238
|
|
-
|
239
|
|
- elf_shstrtab: db ".shstrtab", 0x0, ".text", 0x0
|
240
|
|
- align 8
|
241
|
|
- elf_shstrtab_sz: equ $ - elf_shstrtab
|
242
|
|
-
|
243
|
|
- elf_section_headers: times 8 dq 0x0 ; head0
|
244
|
|
- ; head 1
|
245
|
|
- dw 0xb, 0, 0x1, 0, 0x6, 0, 0, 0
|
246
|
|
- dw 0x80, 0x40, 0, 0, 0x80, 0, 0, 0
|
247
|
|
- elf_section_text_sz: times 8 db 0xFF
|
248
|
|
- dq 0x0
|
249
|
|
- dw 0x10
|
250
|
|
- times 7 dw 0x0
|
251
|
|
- ; head2
|
252
|
|
- dw 0x1, 0, 0x3 , 0, 0, 0, 0, 0
|
253
|
|
- dq 0x0
|
254
|
|
- elf_section_strtab_off: times 8 db 0xFF
|
255
|
|
- dw 0x11
|
256
|
|
- times 7 dw 0x0
|
257
|
|
- dw 0x1
|
258
|
|
- times 7 dw 0x0
|
259
|
|
- elf_section_headers_sz: equ $ - elf_section_headers
|
260
|
|
-
|
261
|
|
- default_output: db "a.out", 0x0
|
262
|
|
-
|
263
|
210
|
miss_open: db "Missing opening '[' matching closing ']'"
|
264
|
211
|
miss_open_sz: equ $ - miss_open
|
265
|
|
- chr_list : db ": ", 0xA, 0x0
|
|
212
|
+ chr_list : db ": ", 0xA
|
266
|
213
|
read_error: db "Error reading file "
|
267
|
214
|
read_error_sz: equ $ - read_error
|
268
|
|
- usage_err: db "Usage : [-e [-o a.out]] FILE.BF"
|
|
215
|
+ usage_err: db "Usage : FILE.BF"
|
269
|
216
|
usage_err_sz: equ $ - usage_err
|
270
|
217
|
open_err: db "Error opening file", 0xa
|
271
|
218
|
open_err_sz: equ $ - open_err
|
272
|
219
|
|
|
220
|
+section .bss
|
|
221
|
+ read_buff: resb 128
|
|
222
|
+
|
273
|
223
|
section .text
|
274
|
224
|
global _start
|
275
|
225
|
_start:
|
276
|
|
-; using heap to store arguments
|
277
|
|
-%define bf_source [r13]
|
278
|
|
-%define elf_file [r13+0x8]
|
279
|
|
-%define elf_out [r13+0x11]
|
280
|
|
-%define heap_size 0x12
|
281
|
|
-
|
282
|
|
- mov rax, 0xc
|
283
|
|
- xor rdi, rdi
|
284
|
|
- syscall
|
285
|
|
- mov rdi, rax
|
286
|
|
- mov r13, rax ; heap start
|
287
|
|
- add rdi, heap_size
|
288
|
|
- mov rax, 0xc
|
289
|
|
- syscall
|
290
|
|
-
|
291
|
|
- ;argument parsing
|
292
|
226
|
mov rcx, [rsp] ; argc
|
293
|
227
|
cmp rcx, 2
|
294
|
|
- jl .badarg
|
295
|
|
- je .init_1arg
|
296
|
|
- cmp rcx, 5
|
297
|
|
- jg .badarg
|
298
|
|
-
|
299
|
|
- mov rsi, rsp
|
300
|
|
- add rsi, 8 ; argv[0]
|
301
|
|
- dec rcx
|
302
|
|
- .argloop:
|
303
|
|
- add rsi, 8
|
304
|
|
- mov rdi, [rsi]
|
305
|
|
- mov al, [rdi]
|
306
|
|
- cmp al, 0x2d ; '-'
|
307
|
|
- jne .filearg
|
308
|
|
- mov al, [rdi+2]
|
309
|
|
- test al, al
|
310
|
|
- jnz .filearg
|
311
|
|
- ; arg is '-X' testing X
|
312
|
|
- mov al, [rdi+1]
|
313
|
|
- cmp al, 0x68 ; '-h'
|
314
|
|
- je .badarg
|
315
|
|
- cmp al, 0x65 ; '-e'
|
316
|
|
- je .elfout_arg
|
317
|
|
- cmp al, 0x6f ; '-o'
|
318
|
|
- jne .badarg
|
319
|
|
-
|
320
|
|
- ; -o storing file
|
321
|
|
- test rcx, rcx
|
322
|
|
- jz .badarg ; no more args
|
323
|
|
- dec rcx
|
324
|
|
- add rsi, 8
|
325
|
|
- mov rdi, [rsi]
|
326
|
|
- mov elf_file, rdi
|
327
|
|
- loop .argloop
|
328
|
|
- jmp .init
|
329
|
|
-
|
330
|
|
- .elfout_arg:
|
331
|
|
- mov al, 0x1
|
332
|
|
- mov elf_out, al
|
333
|
|
- mov rax, elf_file
|
334
|
|
- test rax, rax
|
335
|
|
- jz .default_out
|
336
|
|
- .elfout_arg_end:
|
337
|
|
- loop .argloop
|
338
|
|
- jmp .init
|
339
|
|
- .default_out:
|
340
|
|
- mov rax, default_output
|
341
|
|
- mov elf_file, rax
|
342
|
|
- jmp .elfout_arg_end
|
343
|
|
-
|
344
|
|
- .filearg:
|
345
|
|
- mov rax, bf_source
|
346
|
|
- cmp rax, 0
|
347
|
|
- .br3:
|
348
|
|
- jnz .badarg ; file allready given
|
349
|
|
- mov bf_source, rdi
|
350
|
|
- loop .argloop
|
351
|
|
- jmp .init
|
352
|
|
-
|
353
|
|
- .init_1arg:
|
354
|
|
- mov rax, [rsp+16]
|
355
|
|
- mov bf_source, rax
|
356
|
|
- .init:
|
357
|
|
- ; code map init
|
|
228
|
+ jne .badarg
|
|
229
|
+
|
|
230
|
+ ; JIT code map init
|
358
|
231
|
; rsi map size
|
359
|
232
|
mov rsi, 0x10
|
360
|
233
|
call initmap
|
361
|
234
|
|
362
|
235
|
mov rax, 0x2 ; open
|
363
|
|
- mov rdi, bf_source ; from heap
|
364
|
|
- test rdi, rdi
|
365
|
|
- jz .badarg
|
366
|
|
- xor rsi, rsi ; O_RDONLY
|
367
|
|
- xor rdx, rdx ; no mode
|
|
236
|
+ mov rdi, [rsp+16] ; argv[1]
|
|
237
|
+ xor rsi, rsi ; no flags
|
|
238
|
+ xor rdx, rdx ; O_RDONLY
|
368
|
239
|
syscall
|
369
|
240
|
cmp rax, 0
|
370
|
241
|
jl .err_open
|
371
|
|
- push rax ; fd
|
372
|
|
- push r13 ; heap
|
373
|
242
|
|
374
|
243
|
call compile_bf
|
375
|
244
|
|
376
|
|
- pop r13 ; heap
|
377
|
|
- pop rdi ; fd
|
378
|
|
- sub rax, r15
|
379
|
|
- push rax ; map len
|
380
|
|
-
|
381
|
|
- mov rax, 0x3 ; close
|
382
|
|
- syscall
|
383
|
|
-
|
384
|
|
- mov al, elf_out
|
385
|
|
- test al, al
|
386
|
|
- jnz .write_elf
|
387
|
|
-
|
388
|
|
-
|
389
|
|
- .code_jmp:
|
390
|
|
- ; restore heap
|
391
|
|
- mov rax, 0xc
|
392
|
|
- mov rdi, r13
|
393
|
|
- syscall
|
394
|
245
|
; set code map perm
|
395
|
246
|
mov rax, 0xA ; mprotect
|
396
|
247
|
mov rdi, r15
|
|
@@ -399,91 +250,7 @@ _start:
|
399
|
250
|
syscall
|
400
|
251
|
|
401
|
252
|
push r15
|
402
|
|
- jmp r15 ; end... jumping in bf code map
|
403
|
|
-
|
404
|
|
- .write_elf: ; writing elf file
|
405
|
|
- mov rax, [rsp] ; map len
|
406
|
|
- add rax, bf_start_head_sz
|
407
|
|
- mov [elf_section_text_sz], rax
|
408
|
|
- add rax, elf_head_sz ; elf head + map_ptr
|
409
|
|
- mov [elf_head + 0x60], rax
|
410
|
|
- mov [elf_head + 0x68], rax
|
411
|
|
- mov [elf_section_strtab_off], rax
|
412
|
|
- add rax, elf_shstrtab_sz ; section head offset
|
413
|
|
- xor r14, r14 ; store align padding for section header
|
414
|
|
- xor rbx, rbx
|
415
|
|
- mov bl, al
|
416
|
|
- and bl, 0x0F
|
417
|
|
- test bl, bl
|
418
|
|
- jz .aligned_section
|
419
|
|
- mov r14, 0x10
|
420
|
|
- sub r14, rbx
|
421
|
|
- and al, 0xF0
|
422
|
|
- add rax, 0x10
|
423
|
|
- .aligned_section:
|
424
|
|
- mov [elf_head + 0x28], rax
|
425
|
|
-
|
426
|
|
- mov rax, 0x2
|
427
|
|
- mov rdi, elf_file
|
428
|
|
- mov rsi, 0x40 | 0x200 | 0x1 ; O_CREAT | O_TRUNC | O_WRONLY
|
429
|
|
- mov rdx, 755o ; perm
|
430
|
|
- syscall
|
431
|
|
- cmp rax, 0
|
432
|
|
- jl .err_open
|
433
|
|
-
|
434
|
|
- push rax ; fd
|
435
|
|
-
|
436
|
|
- mov rax, 1
|
437
|
|
- mov rdi, [rsp]
|
438
|
|
- mov rsi, elf_head
|
439
|
|
- mov rdx, elf_head_sz
|
440
|
|
- syscall
|
441
|
|
-
|
442
|
|
- mov rax, 1
|
443
|
|
- mov rdi, [rsp]
|
444
|
|
- mov rsi, bf_start_head
|
445
|
|
- mov rdx, bf_start_head_sz
|
446
|
|
- syscall
|
447
|
|
-
|
448
|
|
- mov rax, 1
|
449
|
|
- mov rdi, [rsp]
|
450
|
|
- mov rsi, r15 ; map_addr
|
451
|
|
- mov rdx, [rsp+8] ; map len
|
452
|
|
- syscall
|
453
|
|
-
|
454
|
|
- mov rax, 1
|
455
|
|
- mov rdi, [rsp]
|
456
|
|
- mov rsi, elf_shstrtab
|
457
|
|
- mov rdx, elf_shstrtab_sz
|
458
|
|
- syscall
|
459
|
|
-
|
460
|
|
- .padloop:
|
461
|
|
- test r14, r14
|
462
|
|
- jz .end_padloop
|
463
|
|
- mov rax, 1
|
464
|
|
- mov rdi, [rsp]
|
465
|
|
- mov rsi, elf_section_headers ; 0x0
|
466
|
|
- mov rdx, 1
|
467
|
|
- syscall
|
468
|
|
- dec r14
|
469
|
|
- jmp .padloop
|
470
|
|
- .end_padloop:
|
471
|
|
-
|
472
|
|
- mov rax, 1
|
473
|
|
- mov rdi, [rsp]
|
474
|
|
- mov rsi, elf_section_headers
|
475
|
|
- mov rdx, elf_section_headers_sz
|
476
|
|
- syscall
|
477
|
|
-
|
478
|
|
- pop rdi ; fd
|
479
|
|
- mov rax, 0x3 ; close
|
480
|
|
- syscall
|
481
|
|
- pop rax ; map_len
|
482
|
|
-
|
483
|
|
- mov rax, 0x3c ; exit
|
484
|
|
- xor rdi, rdi
|
485
|
|
- syscall
|
486
|
|
-
|
|
253
|
+ jmp r15
|
487
|
254
|
|
488
|
255
|
.err_open:
|
489
|
256
|
mov rax, 1 ; write
|
|
@@ -528,9 +295,6 @@ _start:
|
528
|
295
|
mov rax, 0x3c ; exit
|
529
|
296
|
mov rdi, 1
|
530
|
297
|
syscall
|
531
|
|
-%undef heap_size
|
532
|
|
-%undef elf_file
|
533
|
|
-%undef bf_source
|
534
|
298
|
|
535
|
299
|
; Init a writable memory map
|
536
|
300
|
; len in rsi
|
|
@@ -585,9 +349,7 @@ mremap:
|
585
|
349
|
; r14 map size
|
586
|
350
|
; r15 map addr
|
587
|
351
|
; ret :
|
588
|
|
-; rax map ptr
|
589
|
|
-; r15 map addr
|
590
|
|
-; r14 map size
|
|
352
|
+; rax map addr
|
591
|
353
|
compile_bf:
|
592
|
354
|
; Allocating growing heap to store various datas
|
593
|
355
|
; heap start will be stored in r13
|
|
@@ -753,10 +515,7 @@ compile_bf:
|
753
|
515
|
push rdx
|
754
|
516
|
jmp .callcpy
|
755
|
517
|
.loopstart:
|
756
|
|
- mov rbx, map_ptr
|
757
|
|
- sub rbx, r15
|
758
|
|
- push rbx ; loop offset from map start
|
759
|
|
- ;push qword map_ptr ; ret addr
|
|
518
|
+ push qword map_ptr ; ret addr
|
760
|
519
|
mov rsi, bf_loopstart
|
761
|
520
|
mov rdx, bf_loopstart_sz
|
762
|
521
|
push rdx
|
|
@@ -768,15 +527,13 @@ compile_bf:
|
768
|
527
|
mov rdx, bf_loopend_sz
|
769
|
528
|
push rdx
|
770
|
529
|
call code_cpy
|
771
|
|
- mov map_ptr, rax ; rax is map_ptr
|
|
530
|
+ mov map_ptr, rax
|
772
|
531
|
pop rdx
|
773
|
532
|
sub rax, rdx
|
774
|
533
|
add rax, 2 ;arg addr in code map
|
775
|
|
- pop rbx ; loop_start code offset
|
|
534
|
+ pop rbx ; loop_start code addr
|
776
|
535
|
mov [rax], rbx ; loop end jump to start
|
777
|
536
|
mov rax, map_ptr
|
778
|
|
- sub rax, r15 ; loop end offset in map
|
779
|
|
- add rbx, r15 ; loop start addr
|
780
|
537
|
mov [rbx+2], rax ; start jump to end
|
781
|
538
|
jmp .nxtinstr
|
782
|
539
|
|
|
@@ -850,18 +607,15 @@ compile_bf:
|
850
|
607
|
mov rsi, bf_exit
|
851
|
608
|
mov rdx, bf_exit_sz
|
852
|
609
|
call code_cpy
|
853
|
|
- mov map_ptr, rax
|
854
|
610
|
|
855
|
611
|
; restoring stack
|
856
|
612
|
mov rsp, base_rsp
|
857
|
|
- push qword map_ptr
|
858
|
613
|
|
859
|
614
|
; restore heap
|
860
|
615
|
mov rax, 0xc ; brk
|
861
|
616
|
mov rdi, r13
|
862
|
617
|
syscall
|
863
|
618
|
|
864
|
|
- pop rax ; return map_ptr
|
865
|
619
|
ret
|
866
|
620
|
|
867
|
621
|
%undef fd
|