2017-03-15 3 views
2

プリロードカスタムstrchr() - Ubuntuは)(私はそのstrchrを実装

 global strchr 
strchr: 
     cmp  byte[rdi], 0 
     je  end 
     cmp  [rdi], sil 
     je  end 
     add  rdi, 1 
     jmp  strchr 
end: mov  rax, rdi 
     ret 

私が使用しての.soとしてそれをプリロード 、

export LD_PRELOAD=abs/path/to/lib.so 

のUbuntu 16.04クラッシュをクラッシュします。時にはそれは完全にcrahses、時にはSIGILL(破損したデータ?)を表示します。

opensuse 4を使用してプリロードすると動作します。

任意のアイデアなぜですか?マイケル・ペッチへ

+0

どのようにあなたの共有オブジェクトを構築するのですか?あなたは別のシステムでそれを再構築します(バイナリをバイナリにコピーするだけでなく)。 –

+0

@Someprogrammerdude nasm -f elf64 asm.asmを使い、gcc -shared asm.o -o lib.so(Makefile)を使って各システムに構築します – NanoPish

+1

この関数は返されないので 'strchr'に準拠していません文字が見つからない場合はNULLポインタ。 –

答えて

1

ありがとう:文字が見つからない場合、それはNULLを返さないために

(strchr)マニュアルに準拠していません。

固定strchr():

global strchr 
strchr: 
     cmp  [rdi], sil;first check for character (useful if user searches '\0') 
     je  end 
     cmp  byte[rdi], 0;then if it is EoS and the character is not in the string, return NULL 
     je  eos 
     add  rdi, 1 
     jmp  strchr 
eos: mov  rax, 0 
     ret 
end: mov  rax, rdi 
     ret 
関連する問題