2015-08-18 49 views
3

我正在用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 

這應該是最容易的事執行。

我很茫然,請大家幫忙。

+2

'$ v0'應持有的系統調用號,而不是一些地址。所以4看起來是正確的 - 肯定比0x2abbcbe0更好。你的程序永遠不會正常退出,這並不好。你應該使用'exit'系統調用(系統調用號碼1根據你鏈接的頁面)。 – Michael

+0

運行qemu時,您使用哪種mips架構?和Debian的哪個端口(debian-mips或debian-mipsel) –

+0

我使用http://ftp.de.debian.org/debian/dists/squeeze/main/installer-mips/current/images/中的圖片馬耳他/ netboot/ – lillypad

回答

1

如果您願意使用Linux系統調用,然後在MIPS平臺(馬耳他)上,您可以找到系統調用列表here。在這個架構上,Linux映射其從4000開始的系統調用。正在使用的ABI是MIPS o32。下面是該文件的一個片段。請注意,您可以在/usr/include/asm/unistd.h找到您的系統上的文件的副本:

#define __NR_Linux   4000 
#define __NR_exit   (__NR_Linux + 1) 
#define __NR_write   (__NR_Linux + 4) 
#define __NR_exit_group  (__NR_Linux + 246) 

下面的代碼應打印Hello World,然後退出:

.text 
    .globl __start 
__start: 
    li $v0, 4004 
    li $a0, 1 
    la $a1, out_string 
    li $a2, 12 
    syscall 
    li $v0, 4001 
    la $a0, 1 
    syscall 

.data 
    out_string: .asciiz "Hello World\n" 

__NR_exit_group(4246)在Linux的定義man pages與正常exit(4001)的一個主要方法上有所不同:

This system call is equivalent to exit(2) except that it terminates not only the calling thread, but all threads in the calling process's thread group.

+0

這很完美。感謝您指出在哪裏找到unistd.h文件。確實非常有用。現在我可以繼續輕鬆學習mips了。是的,4246是exit_group(0)我通過對_exit函數的反彙編進行了黑客攻擊而獲得它。太感謝了! – lillypad

+0

是的,因爲我注意到你已經碰到了它,所以我添加了4246。祝你好運! –

+0

我現在意識到我錯誤地閱讀了反彙編,並且是4001出現在那裏。 – lillypad