рднрд╛рдЧ 1. QInst: рдПрдХ рджрд┐рди рдЦреЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдлрд┐рд░ рдкрд╛рдВрдЪ рдорд┐рдирдЯ рдореЗрдВ рдЙрдбрд╝рд╛рди рднрд░реЗрдВ (рд▓реЗрдЦрди рдЙрдкрдХрд░рдг рддреБрдЪреНрдЫ рд╣реИ)

рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рдЖрдк рдПрдХ рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдИрдЬреАрдкреАрдПрдл рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рдлрдВрддрд╛рд╕реА рд╕реЗ рд╕реЛрд╡рд┐рдпрдд рдХрд╛рд░реНрдЯреВрдиреЛрдВ рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдФрд░ рдмреБрджреНрдзрд┐рдорд╛рди рд╕рд▓рд╛рд╣ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рдмрд╛рд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рд╛рдзрди рдЙрдкрдХрд░рдг рдмрдирд╛рдПрдВ (рдпрд╛, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, UII !!!) ред рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ, рдореИрдВ рдЧреЛрд▓реНрдбрди рд╣реИрдорд░ рдПрдВрдЯреАрдкреИрдЯрд░ рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдКрдВрдЧрд╛ рдФрд░ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдкрд░рд┐рдЪрд┐рдд QEMU рд╕реЗ рдПрдХ рдЙрдкрдХрд░рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реВрдВрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдХреНрд░реЙрд╕-рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд▓ рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди, рд╕рд╛рде рд╣реА рдкреВрд░реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдорд┐рд▓рддрд╛ рд╣реИред рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди "рдПрдХ рдЫреЛрдЯрд╛ рджреЗрд╢реА рд╕реЛ-рдлрд╛рдЗрд▓ + рдПрдХ рдЫреЛрдЯреА .o- рдлрд╛рдЗрд▓ рдИрдкреАрдкреАрдПрдл рдХреЗ рд╕рд╛рде" рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдиреБрдХреВрд▓рди рдФрд░ рдХреЛрдб рдкреАрдврд╝реА рд╕реЗ рдкрд╣рд▓реЗ QEMU рдХреЗ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рд░реНрджреЗрд╢реЛрдВ рд╕реЗ рдкрд╣рд▓реЗ eBPF рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдирддреАрдЬрддрди, рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рд╣реА, рдЬреЛ рдХреЛрдб рдЬреЗрдирд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛рдиреА, рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рд╕реНрдЯрдо рд░рдирдЯрд╛рдЗрдо рдХреЗ рдХреБрдЫ рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдХреА рдЧрд┐рдирддреА рдирд╣реАрдВ), рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдЫрджреНрдо рдХреЛрдб рдирд╣реАрдВ рд╣реИ:


#include <stdint.h> extern uint8_t *__afl_area_ptr; extern uint64_t prev; void inst_qemu_brcond_i64(uint64_t tag, uint64_t x, uint64_t y, uint64_t z, uint64_t u) { __afl_area_ptr[((prev >> 1) ^ tag) & 0xFFFF] += 1; prev = tag; } void inst_qemu_brcond_i32(uint64_t tag, uint64_t x, uint64_t y, uint64_t z, uint64_t u) { __afl_area_ptr[((prev >> 1) ^ tag) & 0xFFFF] += 1; prev = tag; } 

рдЦреИрд░, рдпрд╣ рд╣рдорд╛рд░реЗ рдпреЛрдЧрд┐рдиреА рдХреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЦреИрд░, рдбрд╛рдЙрдирд▓реЛрдб рдХреИрд╕реЗ рдХрд░реЗрдВ, рдмрд▓реНрдХрд┐ vmazat рд╕реНрдкреНрд░реЗред


рдЬреИрд╕рд╛ рдХрд┐ QEMU.js рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, QEMU рд╕рдВрдЪрд╛рд▓рди рдореЛрдб рдореЗрдВ рд╕реЗ рдПрдХ рдЕрддрд┐рдерд┐ рд╕реЗ рдорд╢реАрди рдХреЛрдб рдХреА рдЬреЗрдЖрдИрдЯреА рдкреАрдврд╝реА рд╣реИ (рд╕рдВрднрд╡рддрдГ, рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд▓рд┐рдП)ред рдЕрдЧрд░ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ рдЕрдкрдиреА рдХреЛрдб рдЬрдирд░реЗрд╢рди рдмреИрдХрдПрдВрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдЗрд╕ рдмрд╛рд░ рдореИрдВ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рдордиреЗ рд░рд╛рдЗрдЯ рд╡реЗрдЬрд┐рдВрдЧ рдХрд░рдХреЗ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдордирдорд╛рдирд╛ рдлреИрд╕рд▓рд╛ рд╣реИ? рдирд╣реАрдВред рдПрдХ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрд╢рд╛рд╡рд╛рджреА рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдиреЛрдВ рдХреЛ рдХрд╛рдЯ рджреЗрдЧрд╛, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЪрд░ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджреЗрдЧрд╛, рдЖрджрд┐ред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд╡рд╣, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рд░рд▓ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЪреАрдЬреЗрдВ рдХрд░рддрд╛ рд╣реИ: рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрдирд╛, "x: = x + 0" рдЬреИрд╕реЗ рднрд╛рд╡реЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдлреЗрдВрдХрдирд╛ рдФрд░ рдЕрдЧрдореНрдп рдХреЛрдб рдХреЛ рд╣рдЯрд╛рдирд╛ред рдФрд░ рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕рднреНрдп рд░рд╛рд╢рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рдиреНрдпрд╛рд╕


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рд╣рдорд╛рд░реА рд╕реНрд░реЛрдд рдлрд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝реЗрдВ: tcg/bpf-loader.c рдФрд░ tcg/instrument.c Makefiles рдореЗрдВред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдХрд┐рд╕реА рджрд┐рди рдЗрд╕реЗ рдКрдкрд░ рдХреА рдУрд░ рдзрдХреЗрд▓рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдВрдд рдореЗрдВ рд╕рдордЭрджрд╛рд░реА рд╕реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рдмрд╕ рдмрд┐рдирд╛ рд╢рд░реНрдд рдЗрди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдФрд░ рдореИрдВ AFL рдХреА рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдкрд░рдВрдкрд░рд╛рдУрдВ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗ рдЬрд╛рдКрдВрдЧрд╛ - рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рд╡реИрд╕реЗ, рдореИрдВ рдПрдПрдлрдПрд▓ рдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдкрд░ рдлрд┐рд░ рд╕реЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реВрдВрдЧрд╛ред


рдмрд╕ "рдкрдбрд╝реЛрд╕реА" рдХреЗ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ - optimize.c grep -R рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдФрд░ рд╣рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ optimize.o рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред


 --- a/Makefile.target +++ b/Makefile.target @@ -110,7 +110,7 @@ obj-y += trace/ obj-y += exec.o obj-y += accel/ obj-$(CONFIG_TCG) += tcg/tcg.o tcg/tcg-op.o tcg/tcg-op-vec.o tcg/tcg-op-gvec.o -obj-$(CONFIG_TCG) += tcg/tcg-common.o tcg/optimize.o +obj-$(CONFIG_TCG) += tcg/tcg-common.o tcg/optimize.o tcg/instrument.o tcg/bpf-loader.o obj-$(CONFIG_TCG_INTERPRETER) += tcg/tci.o obj-$(CONFIG_TCG_INTERPRETER) += disas/tci.o obj-$(CONFIG_TCG) += fpu/softfloat.o 

рддреЛ рдпрд╣рд╛рдБ рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╕реА рдореЗрдВ metaprogramming ...


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкрд┐рдЫрд▓реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ bpf-loader.c рдХреЛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ QEMU рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдЦреАрдВрдЪрддреА рд╣реИред рдФрд░ рд░рд╣рд╕реНрдпрдордп tcg-opc.h рдлрд╝рд╛рдЗрд▓ рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 /* * DEF(name, oargs, iargs, cargs, flags) */ /* predefined ops */ DEF(discard, 1, 0, 0, TCG_OPF_NOT_PRESENT) DEF(set_label, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT) /* variable number of parameters */ DEF(call, 0, 0, 3, TCG_OPF_CALL_CLOBBER | TCG_OPF_NOT_PRESENT) DEF(br, 0, 0, 1, TCG_OPF_BB_END) // ... 

рдХреНрдпрд╛ рдмрдХрд╡рд╛рд╕ рд╣реИ? рдФрд░ рдмрд╛рдд рдмрд╕ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрд░реЛрдд рд╣реЗрдбрд░ рдореЗрдВ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ - рдЖрдкрдХреЛ DEF рдореИрдХреНрд░реЛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ, рдФрд░ рддреБрд░рдВрдд рдореИрдХреНрд░реЛ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред рджреЗрдЦрд┐рдП, рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЧрд╛рд░реНрдб рднреА рдирд╣реАрдВ рд╣реИред


 static const char *inst_function_names[] = { #define DEF(name, a, b, c, d) stringify(inst_qemu_##name), #include "tcg-opc.h" #undef DEF NULL }; 

рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдУрдкрдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдФрд░ NULL рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд▓рдХреНрд╖реНрдп рдлрд╝рдВрдХреНрд╢рди рдирд╛рдореЛрдВ рдХрд╛ рдПрдХ рд╕рд╛рдлрд╝ рд╕рд░рдгреА рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд░рд▓ рд╣реИ, рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреА рдПрдХрдореБрд╢реНрдд рдкреНрд░рдХреГрддрд┐ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдПред рдЕрдЧрд▓рд╛, рд╣рдо рд╕рд┐рд░реНрдл рд╕рднреА рд╡рд░реНрдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП


 ELF64_ST_BIND(sym->st_info) == STB_LOCAL || ELF64_ST_TYPE(sym->st_info) != STT_FUNC 

рдмрд╛рдХреА рд╕реВрдЪреА рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рдБрдЪ рдХреА рд╣реИред


рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВ


рдЕрдм рдЖрдкрдХреЛ рдХреЛрдб рдкреАрдврд╝реА рддрдВрддреНрд░ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдкрд░ рдХрд╣реАрдВ рдЙрдардиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдФрд░ рдЬрдм рддрдХ рдмреНрдпрд╛рдЬ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ tcg/tcg.h рдореЗрдВ рдЕрдкрдиреЗ instrumentation_init , tcg_instrument рдФрд░ instrumentation_shutdown рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ tcg_instrument рдФрд░ рдЙрдирдХреА рдХреЙрд▓ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛: рдЖрд░рдВрднреАрдХрд░рдг - рдмреИрдХрдПрдВрдб рдХреЗ рдЖрд░рдВрдн рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди - tcg_optimize рдХреЙрд▓ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗред рдРрд╕рд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ instrumentation_shutdown рдХреЛ instrumentation_shutdown рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдРрд╕рд╛ рднреА рд╕реЛрдЪрд╛ рдерд╛, рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрд░реНрдг рд╕рд┐рд╕реНрдЯрдо рдЗрдореНрдпреВрд▓реЗрд╢рди рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди exit_group рдЗрдореНрдпреВрд▓реЗрд╢рди рдореЛрдб рдореЗрдВ QEMU, exit_group рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓реНрд╕ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрднреА-рдХрднреА _exit рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ exit рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрди рд╕рднреА _exit -рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╣рдо linux-user/syscall.c рдореЗрдВ рдЗрд╕реЗ linux-user/syscall.c рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рдордиреЗ рд╣рдорд╛рд░реЗ рдХреЛрдб рдкрд░ рдХреЙрд▓ linux-user/syscall.c ред


рдмрд┐рдЯрд░рдЯреЗрдХ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛


рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкрдврд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдХреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ -x рд╡рд┐рдХрд▓реНрдк, рдпрд╛ рдмреЗрд╣рддрд░, рддреБрд░рдВрдд -d -t -r рд╕рд╛рде llvm-objdump рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЖрдЙрдЯрдкреБрдЯ рдЙрджрд╛рд╣рд░рдг
 $ ./compile-bpf.sh test-bpf.o: file format ELF64-BPF Disassembly of section .text: 0000000000000000 inst_brcond_i64: 0: 18 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r2 = 0 ll 0000000000000000: R_BPF_64_64 prev 2: 79 23 00 00 00 00 00 00 r3 = *(u64 *)(r2 + 0) 3: 77 03 00 00 01 00 00 00 r3 >>= 1 4: 7b 32 00 00 00 00 00 00 *(u64 *)(r2 + 0) = r3 5: af 13 00 00 00 00 00 00 r3 ^= r1 6: 57 03 00 00 ff ff 00 00 r3 &= 65535 7: 18 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r4 = 0 ll 0000000000000038: R_BPF_64_64 __afl_area_ptr 9: 79 44 00 00 00 00 00 00 r4 = *(u64 *)(r4 + 0) 10: 0f 34 00 00 00 00 00 00 r4 += r3 11: 71 43 00 00 00 00 00 00 r3 = *(u8 *)(r4 + 0) 12: 07 03 00 00 01 00 00 00 r3 += 1 13: 73 34 00 00 00 00 00 00 *(u8 *)(r4 + 0) = r3 14: 7b 12 00 00 00 00 00 00 *(u64 *)(r2 + 0) = r1 15: 95 00 00 00 00 00 00 00 exit 0000000000000080 inst_brcond_i32: 16: 18 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r2 = 0 ll 0000000000000080: R_BPF_64_64 prev 18: 79 23 00 00 00 00 00 00 r3 = *(u64 *)(r2 + 0) 19: 77 03 00 00 01 00 00 00 r3 >>= 1 20: 7b 32 00 00 00 00 00 00 *(u64 *)(r2 + 0) = r3 21: af 13 00 00 00 00 00 00 r3 ^= r1 22: 57 03 00 00 ff ff 00 00 r3 &= 65535 23: 18 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r4 = 0 ll 00000000000000b8: R_BPF_64_64 __afl_area_ptr 25: 79 44 00 00 00 00 00 00 r4 = *(u64 *)(r4 + 0) 26: 0f 34 00 00 00 00 00 00 r4 += r3 27: 71 43 00 00 00 00 00 00 r3 = *(u8 *)(r4 + 0) 28: 07 03 00 00 01 00 00 00 r3 += 1 29: 73 34 00 00 00 00 00 00 *(u8 *)(r4 + 0) = r3 30: 7b 12 00 00 00 00 00 00 *(u64 *)(r2 + 0) = r1 31: 95 00 00 00 00 00 00 00 exit SYMBOL TABLE: 0000000000000000 l df *ABS* 00000000 test-bpf.c 0000000000000000 ld .text 00000000 .text 0000000000000000 *UND* 00000000 __afl_area_ptr 0000000000000080 g F .text 00000080 inst_brcond_i32 0000000000000000 g F .text 00000080 inst_brcond_i64 0000000000000008 g O *COM* 00000008 prev 

рдпрджрд┐ рдЖрдк eBPF рдСрдкрдХреЛрдб рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд╕реНрдерд╛рдиреЛрдВ (рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕реНрд░реЛрдд рдФрд░ рдореИрди-рдкреЗрдЬ) рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ, рдХреИрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ, рдЖрджрд┐ рдХрд╛ рд╡рд░реНрдгрди рд╣реИред рдлрд┐рд░ рдЖрдк рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ eBPF рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде iovisor рдЯреВрд▓ рдЯреАрдо рдкреЗрдЬ рдкрд░ рдЖрддреЗ рд╣реИрдВред


рдирд┐рд░реНрджреЗрд╢ рдПрдХ 64-рдмрд┐рдЯ рд╢рдмреНрдж (рдХреБрдЫ рджреЛ) рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рд░реВрдк рд╣реЛрддрд╛ рд╣реИ


 struct { uint8_t opcode; uint8_t dst:4; uint8_t src:4; uint16_t offset; uint32_t imm; }; 

рдЬреЛ рд▓реЛрдЧ рджреЛ рд╢рдмреНрджреЛрдВ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕рднреА рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдкрд╣рд▓рд╛ рдирд┐рд░реНрджреЗрд╢ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рддрддреНрдХрд╛рд▓ рдореВрд▓реНрдп рдХреЗ 32 рдФрд░ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ "рдЯреНрд░реЗрд▓рд░" рд╣реЛрддрд╛ рд╣реИ рдФрд░ objdump disassembler рдкрд░ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред


рд╕реНрд╡рдпрдВ рдСрдкрдХреЛрдб рдореЗрдВ рднреА рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ: рдирд┐рдЪрд▓реЗ рддреАрди рдмрд┐рдЯреНрд╕ рдСрдкрд░реЗрд╢рди рдХреНрд▓рд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВ: 32-рдмрд┐рдЯ ALU, 64-рдмрд┐рдЯ ALU, рд▓реЛрдб / рд╕реНрдЯреЛрд░, рд╕рд╢рд░реНрдд рд╢рд╛рдЦрд╛ред рдЗрд╕рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ QEMU рдХреА рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкрд░рдВрдкрд░рд╛рдУрдВ рдореЗрдВ рдореИрдХреНрд░реЛрдЬрд╝ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдореИрдВ рдХреЛрдб рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рд╕реНрддреГрдд рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рд╣рдо рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдкрд░ рдирд╣реАрдВ рд╣реИрдВ рдореИрдВ рдЖрдкрдХреЛ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЗрд╣рддрд░ рдмрддрд╛рддрд╛ рд╣реВрдВред


рдореЗрд░реА рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдореИрдВрдиреЗ QEMU- local_temp рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЖрд▓рд╕реА рдИрдЬреАрдкреАрдПрдл рд░рдЬрд┐рд╕реНрдЯрд░ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ local_temp , рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЙрд▓ рдХреЛ рдореИрдХреНрд░реЛ рдореЗрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдпрд╣ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдореЗрдо рдХреА рддрд░рд╣ рдирд┐рдХрд▓рд╛: "рд╣рдордиреЗ рдПрдХ рдЕрдореВрд░реНрдд рдореЗрдВ рдПрдХ рдЕрдореВрд░реНрдд рдбрд╛рд▓рд╛ рддрд╛рдХрд┐ рдЖрдк рдПрдХ рдЕрдиреБрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╕рдордп рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХреЗрдВред" рддрдереНрдп рдХреЗ рдмрд╛рдж, рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдХрд┐ рддрдм рдХреНрдпрд╛ рдЯреВрдЯ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЕрдЬреАрдм рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣реЛ рд░рд╣рд╛ рдерд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ tcg_gen_... рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмреАрдЪ рдореЗрдВ рдирдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдСрдкрд░реЗрдВрдб рд▓реЗ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЪреВрдВрдХрд┐ рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ) рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░рдо рдмрди рдЧрдпрд╛ред


рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдмрд░реНрдЦрд╛рд╕реНрддрдЧреА рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ TCG рдХрд╛рд╕реНрдЯ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реА рдереА рдЬрдм eBPF рдореЗрдВ рддрддреНрдХрд╛рд▓ рдСрдкрд░реЗрдВрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдПред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдП рдЧрдП tcg-opc.h , рдСрдкрд░реЗрд╢рди рдХреА рддрд░реНрдХ рд╕реВрдЪреА рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕рдЦреНрддреА рд╕реЗ рддрдп рдХреА рдЧрдИ рд╣реИ: n рдЗрдирдкреБрдЯ рддрд░реНрдХ, m рдЖрдЙрдЯрдкреБрдЯ рдФрд░ k рд╕реНрдерд┐рд░рд╛рдВрдХред рд╡реИрд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдбреАрдмрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ QEMU рдХреЛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ -d op,op_opt рдпрд╛ even -d op,op_opt,out_asm рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред


рд╕рдВрднрд╡ рддрд░реНрдХ
 $ ./x86_64-linux-user/qemu-x86_64 -d help Log items (comma separated): out_asm show generated host assembly code for each compiled TB in_asm show target assembly code for each compiled TB op show micro ops for each compiled TB op_opt show micro ops after optimization op_ind show micro ops before indirect lowering int show interrupts/exceptions in short format exec show trace before each executed TB (lots of logs) cpu show CPU registers before entering a TB (lots of logs) fpu include FPU registers in the 'cpu' logging mmu log MMU-related activities pcall x86 only: show protected mode far calls/returns/exceptions cpu_reset show CPU state before CPU resets unimp log unimplemented functionality guest_errors log when the guest OS does something invalid (eg accessing a non-existent register) page dump pages at beginning of user mode emulation nochain do not chain compiled TBs so that "exec" and "cpu" show complete traces trace:PATTERN enable trace events Use "-d trace:help" to get a list of trace events. 

рдареАрдХ рд╣реИ, рдореЗрд░реА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рди рджреЛрд╣рд░рд╛рдПрдВ: рдЖрдВрддрд░рд┐рдХ рдирд┐рд░реНрджреЗрд╢ add_i64 loc15,loc15,$554412123213 рдХрд╛рдлреА рдЙрдиреНрдирдд рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА add_i64 loc15,loc15,$554412123213 рдЬреИрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдбреЙрд▓рд░ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рдмрд╛рдж рдпрд╣ рдмрд╛рдд рдХреЛрдИ рд╕реВрдЪрдХ рдирд╣реАрдВ рд╣реИред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдпрд╣, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдХ рд╕реВрдЪрдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЭрдВрдбреЗ рдХреЗ рд╕рд╛рде рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╢рд╛рдмреНрджрд┐рдХ рдореВрд▓реНрдп рдХреА рднреВрдорд┐рдХрд╛ рдореЗрдВ рд╣реИ, рдФрд░ рд╕реВрдЪрдХ рдирд╣реАрдВред рдпрд╣ рд╕рдм рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ $0 рдпрд╛ $ff , рддреЛ рдЖрдкрдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдбрд░рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред :) рдЗрд╕рд╕реЗ рдХреИрд╕реЗ movi - рдЖрдкрдХреЛ рдмрд╕ рдПрдХ рдлрдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдПрдХ рддрд╛рдЬрд╛ temp рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ movi рдорд╛рдзреНрдпрдо рд╕реЗ movi рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рд░рдЦрддрд╛ рд╣реИред


рд╡реИрд╕реЗ, рдпрджрд┐ рдЖрдк tcg/tcg.c #define USE_TCG_OPTIMIZATIONS рдореЗрдВ #define USE_TCG_OPTIMIZATIONS рдЯрд┐рдкреНрдкрдгреА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ, рдЕрдЪрд╛рдирдХ, рдЕрдиреБрдХреВрд▓рди рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред


рд╕рд┐рдо рдХреЗ рд▓рд┐рдП, рдореИрдВ QEMU рдХреЛ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдкрд╛рдардХ рдХреЛ рднреЗрдЬреВрдВрдЧрд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдПрдХ рднреА! рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП, рдореИрдВ AFL рдХреЗ рд▓рд┐рдП рд╡рд╛рджрд╛ рдХрд┐рдП рдЧрдП рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реВрдВрдЧрд╛ред


рд╡рд╣реА рдФрд░ рдЦрд░рдЧреЛрд╢


рд░рдирдЯрд╛рдЗрдо рдХреЗ рдкреВрд░реЗ рдкрд╛рда рдХреЗ рд▓рд┐рдП, рдореИрдВ, рдлрд┐рд░ рд╕реЗ, рдкрд╛рдардХ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рднреЗрдЬреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ (рдкрд╛рда) рдХрд▓рд╛рддреНрдордХ рдореВрд▓реНрдп рдХрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ AFL рдбрд┐рд▓реАрд╡рд░реА рд╕реЗ qemu_mode рд╕реЗ рдХрдареЛрд░ рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕реА рдХреЛрдб рдХрд╛ рдПрдХ рдирд┐рдпрдорд┐рдд рдЯреБрдХрдбрд╝рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИред :


 #include <stdint.h> extern uint8_t *__afl_area_ptr; extern uint64_t prev; void inst_qemu_brcond_i64(uint64_t tag, uint64_t x, uint64_t y, uint64_t z, uint64_t u) { __afl_area_ptr[((prev >> 1) ^ tag) & 0xFFFF] += 1; prev = tag; } void inst_qemu_brcond_i32(uint64_t tag, uint64_t x, uint64_t y, uint64_t z, uint64_t u) { __afl_area_ptr[((prev >> 1) ^ tag) & 0xFFFF] += 1; prev = tag; } 

рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣реБрдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЗрд╕реА QEMU рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП iargs рд░реВрдк рдореЗрдВ рдХрдИ рддрд░реНрдХ рд╣реИрдВред рд╣реЗрдбрд░ рдореЗрдВ рджреЛ extern рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рд░рдирдЯрд╛рдЗрдо рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, prev рдХреЛ рдпрд╣реАрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрдм рдЗрд╕реЗ static рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ COMMON рд╕реЗрдХреНрд╢рди рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ред рджрд░рдЕрд╕рд▓, рд╣рдо, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдЫрджреНрдо рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдпрд╣ рдорд╢реАрди-рдкрдардиреАрдп рд╣реИ!


рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, bug.c рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:


 #include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char *argv[]) { char buf[16]; int res = read(0, buf, 4); if (buf[0] == 'T' && buf[1] == 'E' && buf[2] == 'S' && buf[3] == 'T') abort(); return res * 0; } 

рдФрд░ рдпрд╣ рднреА - forksrv рдлрд╝рд╛рдЗрд▓, рдЬреЛ AFL рдХреЛ рдЦрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ:


 #!/bin/bash export NATIVE_INST=./instrumentation-examples/afl/afl-native.so export BPF_INST=./instrumentation-examples/afl/afl-bpf.co exec ./x86_64-linux-user/qemu-x86_64 ./instrumentation-examples/afl/bug 

рдФрд░ рдлрд╝рдЬрд╝рд┐рдВрдЧ рдЪрд▓рд╛рдПрдВ:


 AFL_SKIP_BIN_CHECK=1 afl-fuzz -i ../input -o ../output -m none -- ./forksrv 

рдЕрдореЗрд░рд┐рдХреА рдлрдЬреА рд▓реЛрдк
 1234 T234 TE34 TES4 TEST <-     crashes,    2200   

рдЕрдм рддрдХ, рдЧрддрд┐ рдЗрддрдиреА рдЧрд░реНрдо рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╣рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣рд╛рдВ (рдЕрднреА рдХреЗ рд▓рд┐рдП) рдореВрд▓ qemu_mode рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдХрд╛рдВрдЯрд╛ рд╕рд░реНрд╡рд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХреЗ рдкрддреЗ рднреЗрдЬрдирд╛ред рд▓реЗрдХрд┐рди рдЕрдм рдХреНрдпреВрдИрдПрдордпреВ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдПрдПрдлрдПрд▓ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХрд┐рд╕реА рджрд┐рди рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдЕрдкрд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЪрд░рдорд░рд╛ рдЬрд╛рдПрдЧрд╛ред


рдЧрд┐рдЯрд╣рдм рдкрд░рд┐рдпреЛрдЬрдирд╛

Source: https://habr.com/ru/post/hi452608/


All Articles