рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВ linux рдореЗрдВ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреЗ рдвреЗрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд░реБрдЪрд┐ рд╣реЛ рдЧрдИред рдХреБрдЫ рд╢реЛрдз рдЦрд░реНрдЪ рдХрд┐рдП рдФрд░ рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рдкрд░рд┐рдгрд╛рдо рдкреЗрд╢ рдХрд░рддрд╛ рд╣реВрдВред
рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк:
1. int рдореБрдЦреНрдп ()
2. int рдореБрдЦреНрдп (int argc, char ** argv)
3. int рдореБрдЦреНрдп (int argc, char ** argv, char ** env)
4. рдЗрдВрдЯ рдореЗрди (int argc, char ** argv, char ** env, ElfW (auxv_t) auxv]]
5. рдЗрдВрдЯ рдореЗрди (int argc, char ** argv, char ** env, char ** apple)
argc - рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛
Argv - рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд▓-рдЯрд░реНрдорд┐рдирд▓ рд╕рд░рдгреА
env рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХрд╛ рдПрдХ рд╢реВрдиреНрдп рдЯрд░реНрдорд┐рдирд▓ рд╕рд░рдгреА рд╣реИред рд╕реНрд╡рд░реВрдк рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ NAME = VALUE
рдСрдХреНрд╕рд╡ - рд╕рд╣рд╛рдпрдХ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА (рдХреЗрд╡рд▓ рдкрд╛рд╡рд░рдкреАрд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз [1])
рд╕реЗрдм - рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде (MacOS рдФрд░ рдбрд╛рд░реНрд╡рд┐рди рдкрд░ [2])
рд╕рд╣рд╛рдпрдХ рд╡реЗрдХреНрдЯрд░ рд╡рд┐рднрд┐рдиреНрди рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдкреНрд░рднрд╛рд╡реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рд╕реЗрддреБ рдмрд┐рдЯ рд╡рд┐рд╢реЗрд╖рддрд╛, рдореЗрдореЛрд░реА рдкреЗрдЬ рдХрд╛ рдЖрдХрд╛рд░, рдЖрджрд┐ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, i386 рдФрд░ x86_64 рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рд╕рд╛рде рд╣реА рд╕реНрдЯреИрдХ рдХреЗ "рд╕реЗрдЧрдореЗрдВрдЯ" рдХреА рдмрд╛рдХреА рд╕рд╛рдордЧреНрд░реА рднреАред
рд╕реНрдЯреИрдХ рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛ рдЖрдХрд╛рд░ рдореИрдкреНрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдмрд┐рд▓реНрд▓реА / рдЦрд░реАрдж / 10918 / рдирдХреНрд╢реЗ
...
7ffffffa3000-7ffffff000 rw-p 00000000 00:00 0 [рд╕реНрдЯреИрдХ]
...
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд▓реЛрдбрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ, рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдФрд░ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ 64 рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред
рдКрдкрд░ рд╡рд░рд┐рд╖реНрда рдкрддрд╛ред
1ред | 0x7ffffffff000 | рд╕реНрдЯреИрдХ рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛ рд╢реАрд░реНрд╖ рдмрд┐рдВрджреБред рдЕрдкреАрд▓ рдХреЙрд▓ segfault |
| 0x7ffffffff0f8 | рд╢реВрдиреНрдп | рд╢реВрдиреНрдп * | 8 | 0x00 ' |
2ред | | рдлрд╝рд╛рдЗрд▓ рдирд╛рдо [рдХреЛ реж] | рдЪрд╛рд░ | 1 + | ┬л/Tmp/a.out┬╗ |
| | | рдЪрд╛рд░ | 1 | 0x00 |
... |
| | env [1] [реж] | рдЪрд╛рд░ | 1 | 0x00 |
... |
| | | рдЪрд╛рд░ | 1 | 0x00 |
3ред | 0x7fffffffe5e0 | env [0] [реж] | рдЪрд╛рд░ | 1 | .. |
| | | рдЪрд╛рд░ | 1 | 0x00 |
... |
| | argv [1] [реж] | рдЪрд╛рд░ | 1 | 0x00 |
... |
| | | рдЪрд╛рд░ | 1 | 0x00 |
4ред | 0x7fffffffe5be | argv [0] [0] | рдЪрд╛рд░ | 1 + | ┬л/Tmp/a.out┬╗ |
5ред | | рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд▓рдВрдмрд╛рдИ рдХреА рд╕рд░рдгреА |
6ред | | рдСрдХреНрд╕рд╡ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ | рд╢реВрдиреНрдп * [] | 48 ' | |
| | AT_NULL | Elf64_auxv_t | 16 | {0,0} |
... |
| | рдСрдХреНрд╕рд╡ [1] | Elf64_auxv_t | 16 |
7ред | | рдСрдХреНрд╕рд╡ [0] | Elf64_auxv_t | 16 | Exред: {0x0e, 0x3e8} |
| | рд╢реВрдиреНрдп | рд╢реВрдиреНрдп * | 8 | 0x00 |
... |
| | env [1] | рдЪрд╛рд░ * | 8 | |
8ред | 0x7fffffffe308 | env [0] | рдЪрд╛рд░ * | 8 | 0x7fffffffe5e0 |
| | рд╢реВрдиреНрдп | рд╢реВрдиреНрдп * | 8 | 0x00 |
... |
| | argv [1] | рдЪрд╛рд░ * | 8 | |
9ред | 0x7fffffffe2f8 | argv [0] | рдЪрд╛рд░ * | 8 | 0x7fffffffe5be |
10ред | 0x7fffffffe2f0 | argc | рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ int | 8 ' | рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ + 1 |
11ред | | рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдФрд░ рддрд░реНрдХ, рдХрд╛рд░реНрдп рдореБрдЦреНрдп рд╕реЗ рдкрд╣рд▓реЗ рдХрд╣рддреЗ рд╣реИрдВ |
12ред | | рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореБрдЦреНрдп |
13ред | 0x7fffffffe1fc | argc | рдкреВрд░реНрдгрд╛рдВрдХ | 4 | рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ + 1 |
| 0x7fffffffe1f0 | argv | рдЪрд╛рд░ ** | 8 | 0x7fffffffe2f8 |
| 0x7fffffffe1e8 | env | рдЪрд╛рд░ ** | 8 | 0x7fffffffe308 |
14ред | | рд╕реНрдерд╛рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рдЪрд░ |
'- рдореБрдЭреЗ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдореЗрдВ рдЦреЗрддреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рд╡реЗ рдбрдВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред
рдореИрдВрдиреЗ 32 рдмрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЖрдХрд╛рд░реЛрдВ рдХреЛ рджреЛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
1. рд╢реАрд░реНрд╖ рд╕реЗ рдКрдкрд░ рдХреЗ рдкрддреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ Segfault рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред
2. рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкрдеред
3. рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рд╕рд╛рде рддрд╛рд░ рдХреА рд╕рд░рдгреА
4. рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рд░ рдХреА рд╕рд░рдгреА
5. рд╕рд░рдгреА рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рд▓рдВрдмреА рд╣реИред рдЗрд╕рдХреЗ рдЪрдпрди рдХреЛ рдХрдорд╛рдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
sysctl -w kernel.randomize_va_space = 0
рдкреНрд░рддрд┐рдзреНрд╡рдирд┐ 0> / proc / sys / рдХрд░реНрдиреЗрд▓ / randomize_va_space
6. рд╕рд╣рд╛рдпрдХ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреНрд░рд┐рдВрдЧ "x86_64")
7. рд╕рд╣рд╛рдпрдХ рд╡реЗрдХреНрдЯрд░ред рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдиреАрдЪреЗред
8. рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рддрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХреЗ рд╢реВрдиреНрдп рдЯрд░реНрдорд┐рдирд▓ рд╕рд░рдгреА
9. рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдирд▓-рдЯрд░реНрдорд┐рдирд▓ рд╕рд░рдгреА рдСрдлрд╝ рдкреЙрдЗрдВрдЯрд░реНрд╕
10. рдорд╢реАрди рд╢рдмреНрдж рдЬрд┐рд╕рдореЗрдВ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ ("рд╡рд░рд┐рд╖реНрда" рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдкреИрд░рд╛ 11 рджреЗрдЦреЗрдВ)
11. рдореБрдЦреНрдп рд╕реЗ рдкрд╣рд▓реЗ рдХрд╣реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдореБрдЦрд░ рдЪрд░ рдФрд░ рддрд░реНрдХ (_start, __ libc_start_main)
12. рдореБрдЦреНрдп рдореЗрдВ рдШреЛрд╖рд┐рдд рдЪрд░
13. рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреЗ рддрд░реНрдХ
14. рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЪрд░ рдФрд░ рддрд░реНрдХред
рд╣реЗрд▓реНрдкрд░ рд╡реЗрдХреНрдЯрд░
I386 рдФрд░ x86_64 рдХреЗ рд▓рд┐рдП, рд╕рд╣рд╛рдпрдХ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХрд╛ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╡реЗрдХреНрдЯрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рд╕рдВрдХреЗрдд рдХреА рд╕рд░рдгреА рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕реНрдореГрддрд┐ рдХреНрд╖реЗрддреНрд░ рдХреА рдУрд░ рдореБрдбрд╝рдирд╛ рд╣реИред
рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
#include <stdio.h> #include <elf.h> int main(int argc, char** argv, char** env){ Elf64_auxv_t *auxv; //x86_64 // Elf32_auxv_t *auxv; //i386 while(*env++ != NULL); // for (auxv = (Elf64_auxv_t *)env; auxv->a_type != AT_NULL; auxv++){ printf("addr: %p type: %lx is: 0x%lx\n", auxv, auxv->a_type, auxv->a_un.a_val); } printf("\n (void*)(*argv) - (void*)auxv= %p - %p = %ld\n (void*)(argv)-(void*)(&auxv)=%p-%p = %ld\n ", (void*)(*argv), (void*)auxv, (void*)(*argv) - (void*)auxv, (void*)(argv), (void*)(&auxv), (void*)(argv) - (void*)(&auxv)); printf("\n argc copy: %d\n",*((int *)(argv - 1))); return 0; }
рдПрд▓реНрдл рд╕рдВрд░рдЪрдирд╛рдПрдВ {32,64} _auxv_t /usr/include/elf.h рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред рд▓рд┐рдирдХреНрд╕-рдХрд░реНрдиреЗрд▓ / fs / binfmt_elf.c рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рднрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп
рд╡реЗрдХреНрдЯрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛:
hexdump / proc / self / auxv
рд╕рдмрд╕реЗ рдкрдардиреАрдп рджреГрд╢реНрдп рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ LD_SHOW_AUXV рд╕реЗрдЯ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
LD_SHOW_AUXV = 1 рдПрд▓.рдПрд╕.
AT_HWCAP: bfebfbff // processor рдлреАрдЪрд░реНрд╕
AT_PAGESZ: 4096 // рдореЗрдореЛрд░реА рдкреЗрдЬ рдХрд╛ рдЖрдХрд╛рд░
AT_CLKTCK: 100 // рддрд╛рдЬрд╝рд╛ рджрд░ рдмрд╛рд░ ()
AT_PHDR: 0x400040 // рд╣реИрдбрд░ рдЬрд╛рдирдХрд╛рд░реА
AT_PHENT: 56
AT_PHNUM: 9
AT_BASE: 0x7fd00b5bc000 // рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд╛ рдкрддрд╛, рдпрд╛рдиреА, ldso
AT_FLAGS: 0x0
AT_ENTRY: 0x402490 // рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ
AT_UID: 1000 // рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рд╕рдореВрд╣ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛
AT_EUID: 1000 // рд░реЗрдЯреЗрдб рдФрд░ рдкреНрд░рднрд╛рд╡реА
AT_GID: 1000
AT_EGID: 1000
AT_SECURE: 0 // рдХреНрдпрд╛ рд╕реЗрддреБ рдХреЗ рдЭрдВрдбреЗ рдХреЛ рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
AT_RANDOM: 0x7fff30bdc809 // рдкрддрд╛ 16 рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмрд╛рдЗрдЯреНрд╕,
рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдЙрддреНрдкрдиреНрди
AT_SYSINFO_EHDR: 0x7fff30bff000 // рд╕реВрдЪрдХ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
// рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓
AT_EXECFN: / bin / ls
AT_PLATFORM: x86_64
рдмрд╛рдИрдВ рдУрд░ рдЪрд░ рдХрд╛ рдирд╛рдо рд╣реИ, рджрд╛рдИрдВ рдУрд░ рдореВрд▓реНрдп рд╣реИред рд╕рднреА рд╕рдВрднрд╡ рдЪрд░ рдирд╛рдо рдФрд░ рдЙрдирдХреЗ рд╡рд┐рд╡рд░рдг elf.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред (AT_ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░рд╛рдВрдХ)
рдореБрдЦреНрдп рд╕реЗ рд╡рд╛рдкрд╕реА ()
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдирд┐рдпрдВрддреНрд░рдг рдореБрдЦреНрдп (), рд▓реЗрдХрд┐рди _start () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
main () __libc_start_main рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЕрдВрддрд┐рдо рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ - рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╕рдВрдХреЗрддрдХ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореБрдЦреНрдп () рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЗрд╕ рд╕реВрдЪрдХ рдХреЛ рд╕реНрдЯреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдлрд╝рд╛рдЗрд▓ glibc-2.11 / sysdeps / ia64 / elf / start.S рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, __libc_start_main рдХреЗ рдкрд╛рд╕ рддрд░реНрдХ рд╣реИрдВред
/ *
* __Libc_start_main рдХреЗ рд▓рд┐рдП рддрд░реНрдХ:
* out0: рдореБрдЦреНрдп
* out1: argc
* out2: argv
* рдЖрдЙрдЯ 3: рдЗрдирд┐рдЯ
* рдЖрдЙрдЯ 4: рдлрд┐рдиреА // рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдореБрдЦреНрдп рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
* рдЖрдЙрдЯ 5: rtld_fini
* рдЖрдЙрдЯ 6: рд╕реНрдЯреИрдХ_рдПрдВрдб
* /
рдпрд╛рдиреА рдЕрдВрддрд┐рдо рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдкрддреЗ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкрд┐рдЫрд▓реЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореБрдЦреНрдп рд╕реЗ рджреЛ рдорд╢реАрди рд╢рдмреНрджреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ (рдкреНрд░рджрд░реНрд╢рди рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ):
#include <stdio.h> void **ret; void *leave; void foo(){ void (*boo)(void); // printf("Stack rewrite!\n"); boo = (void (*)(void))leave; boo(); // fini() } int main(int argc, char *argv[], char *envp[]) { unsigned long int mark = 0xbfbfbfbfbfbfbfbf; //, ret = (void**)(&mark+2); // , , (fini) leave = *ret; // *ret = (void*)foo; // return 0; // foo() }
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред
рд╕реМрднрд╛рдЧреНрдп рд╣реИред
рдорджрджрдЧрд╛рд░ рдЯрд┐рдк рдХреЗ рд▓рд┐рдП Xeor рдХреЛ рдзрдиреНрдпрд╡рд╛рджред
1. www.gelato.unsw.edu.au/IA64wiki/AuxiliaryVector
2. unixjunkie.blogspot.com/2006/02/char-apple-argument-vector.html
3. articles.manugarg.com/aboutelfauxiliaryvectors.html
4. www.phrack.org/issues.html?issue=58&id=5#article
5. unixforum.org/index.php?showtopic=94993&st=30
6. source.redhat.com/ml/libc-alpha/2007-06/msg00108.html
7. linux-kernel / fs / binfmt_elf.c
8./usr/include/elf.h
9. glibc-2.11 / sysdeps / ia64 / elf / libc-start.c