我正在用qemu運行Debian Squeeze mips架構,只是想弄清楚系統調用的是我可以放入$ v0執行的東西。我找到了這個webpage。雖然此頁確實告訴我寫入命令使用4.我執行以下操作:Debian Mips系統調用unistd.h缺失?
我正在使用this image來安裝Debian Squeeze。
是它使用MIPS的系統架構:
uname -a
Linux debian 2.6.32-5-4kc-malta #1 Sat Feb 16 12:43:42 UTC 2013 mips GNU/Linux
--test.asm--
.global __start
.text
__start:
li $v0, 4
li $a0, 1
la $a1, out_string
li $a2, 12
syscall
.data
out_string: .asciiz "Hello World\n"
現在我總合使用 '爲' 和使用 'LD'
鏈接as -march=mips32 -o test.o test.asm
ld -o test.out test.o
chmod +x test.out
./test.out
這很不幸導致錯誤:Illegal Instruction
。
我編譯了下面的c程序來確定write函數使用的偏移量,它是重複檢查的參數。
--write.c--
#include <stdio.h>
int main(int argc, char *argv[]){
printf("Hello World\n");
return 0;
}
運行strace -i ./write.out
給出:
[2abbcbe0] write(1, "Hello World\n", 12Hello World)
寫狀態的人頁面如下:
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
我試圖用寫命令輸出「Hello World」,它自己的工作很好。
這裏的寫入功能的功能說明,我是如何得到我的方式已經編碼TEST.ASM:
FD或$ A0 - 已經從電話中得到的文件描述符打開。它是一個整數值。值0,1,2也可以給出,對於標準輸入,標準輸出&標準誤差,分別
拋光輪或$ A1 - 指向的字符陣列,它可以被用於存儲從內容獲得fd指向的文件。
nbytes或$ a2 - 指定要從字符數組寫入到fd指向的文件中的字節數。
因此,我們到達順序:
#0x4 being what unistd.h for mips tells us the system call code is 4
$v0, 4
#Set first argument to the std output 1 for the file descriptor
$a0, 1
#Set the address for the string or buff
$a1, out_string
#Set nbytes or total bytes of the string
$a2, 12
這個例子只是正常工作在火星和垃圾消息,雖然有一個參數,而不是3:
--example.asm--
.data
out_string: .asciiz "\nHello, World!\n"
.text
main:
li $v0, 4
la $a0, out_string
syscall
li $v0, 10
syscall
由於我得到Illegal Instruction
與test.asm這意味着我必須指向一條無效的指令。儘管在here之前觀察到系統調用代碼。即使它是mips體系結構的unistd.h文件,但我們確認它正在查看寫入的手冊頁及其所需的參數,但它不正確。所以現在我試了一下,認爲$ v0更早地指向錯誤的指令,並發現使用0x2abbcbe0
的指令指針。也許這會工作?咱們試試吧。
在strace中,-i選項在系統調用時打印指令指針。
所以我編輯ASM文件
--test.asm--
.global __start
.text
__start:
li $v0, 0x2abbcbe0
li $a0, 1
la $a1, out_string
li $a2, 12
syscall
.data
out_string: .asciiz "Hello World\n"
運行組裝和重新鏈接過程:
as -march=mips32 -o test.o test.asm
ld -o test.out test.o
chmod +x test.out
./test.out
這不幸導致錯誤:再次,Illegal Instruction
。
我也逆轉了$ a寄存器,認爲我做了這個倒退,我多次運行strace並確認指令指針中的值不會改變,表明aslr實際上被禁用。我在/ usr/include /中查找了unistd.h文件,它看起來不像從開頭介紹的那個網站。有趣的是,這種結構在Spim和Mars中都是完美的,它們都使用li $ v0,4模擬他們的打印/寫入系統調用。我知道Mars和Spim使用他們自己的模擬系統調用。想到strace會爲我找到它們,但這似乎沒有解決。
我在哪裏可以找到$ v0的正確值?我覺得我已經把Google弄到了現在它毫無意義的地步。
也許我弄亂了asm文件,它的語法?
讓我們嘗試一些更簡單的只是運行退出:
.global __start
.text
__start:
li $v0, 1
li $a0, 0
syscall
組裝連接和運行
as -march=mips32 -o test.o test.asm
ld -o test.out test.o
chmod +x test.out
./test.out
Illegal Instruction
也試過它不-march=mips32
as -o test.o test.asm
ld -o test.out test.o
chmod +x test.out
./test.out
Illegal Instruction
這應該是最容易的事執行。
我很茫然,請大家幫忙。
'$ v0'應持有的系統調用號,而不是一些地址。所以4看起來是正確的 - 肯定比0x2abbcbe0更好。你的程序永遠不會正常退出,這並不好。你應該使用'exit'系統調用(系統調用號碼1根據你鏈接的頁面)。 – Michael
運行qemu時,您使用哪種mips架構?和Debian的哪個端口(debian-mips或debian-mipsel) –
我使用http://ftp.de.debian.org/debian/dists/squeeze/main/installer-mips/current/images/中的圖片馬耳他/ netboot/ – lillypad