2017-03-11 16 views
0

sys_execve(X86_64)をトリガーしようとしています。nasm assembly sys_execve/bin/sh

section .data 
file db "/bin/sh",0 

section .text 
global _start 

_start: 

mov rax, 59 
mov rdi, file 
lea rsi, [file] 
mov rdx, 0 
syscall 

それは、セグメンテーションフォールト私が間違っているのは何

を与えますか?

私もCソースでそれを入れてみました:

int main(void) 
{ 
char shellcode[] = 
"\xb8\x3b\x00\x00\x00" 
"\x48\xbf\xd0\x00\x60\x00\x00" 
"\x00\x00\x00" 
"\x48\x8d\x34\x25\xd0\x00\x60" 
"\x00" 
"\xba\x00\x00\x00\x00" 
"\x0f\x05"; 

(*(void (*)()) shellcode)(); 

return 0; 
} 

また、これは私のセグメンテーションフォールトを与える...

+0

'LEAのRSI、[ファイル]が'間違っています。 – Jester

+0

さらにいくつかのタグをスパムするのはどうですか? – Olaf

+0

@ Jester:私はexecveが文字列のポインタを2番目のパラメータとして必要と思ったのですか? – int80

答えて

0

私はそれを考え出した:

section .data 
file db '/bin/sh',0 
file_arg db 'sh',0 
argv dq file_arg, 0 

section .text 
global _start 
_start: 
mov  rax, 59 
mov  rdi, file 
mov  rsi, argv 
mov  rdx, 0 
syscall 
0

をあなたがすることによってポインタとして文字列/bin/sh間接参照にカーネルを引き起こしていますそのアドレスをrsiに読み込みます。

だけdxを設定することにより、空の環境と引数を渡すとsi

0に
section .text 
global _start 

_start: 
    mov rax, 59 
    mov rdi, file // *filename 
    mov rsi, 0  // *argv 
    mov rdx, 0  // *envp 
    syscall 

section .data 
    file db "/bin/sh",0 
+0

答えはちょっとね。いいえ、それは動作していません。私がそれを実行し、echo $ 0と言うと、 "bash"と言います。 – int80