linux下64位彙編的系統呼叫 1

2021-09-23 21:27:23 字數 1995 閱讀 3899

現在基本上系統都是64位了,而64位系統下的彙編和32位有了較大的變化,無論是系統呼叫的介面還是c標準庫的介面都和32位彙編有所不同;下面簡單談一下在64位linux下如何利用彙編直接呼叫系統呼叫。

需要準備的有:

1.一台linux機器:我的系統是ubuntu 14.10 x64版;

2.還要乙個彙編器;我沒有使用gas,而是使用了跨平台的nasm;

3.乙個偵錯程式;這裡選擇的不多,要不就是gdb,要不就是lldb,不過這裡選擇前者。

4.乙個編輯器,linux下有很多優秀的語法編輯器,這裡用的是sublime,不過可選的還有很多,比如geany,scite,atom等等,大家可以自便。

5.最好還要乙個c的編譯環境,這樣方便參考;linux下可選的貌似也不少我常用的有code::blocks和codelite,這裡選擇後者:一方面其動態除錯的彙編支援還不賴,另一方面其本身版本迭代比較快,至少比codeblocks要快得多。

6.還有神馬!?如果可以搞到的話,ida pro也有linux版本哦!其靜態除錯的功能那是超級優秀啊!正版價高達幾百美刀啊!不過網上可以覓到xx版本的,不過ida一貫的做法是將32和64位反彙編器分開啊,貌似64位的xx版逆向器比較難搞到。

下面講一下linux彙編中基本的嘗試新問題,首先linux下32位和64位的syscall table呼叫號是完全不同的,對於本貓的系統來說呼叫號檔案可以用:

locate unistd_32

//或者

locate unistd_64

命令快速定位,如果系統曾安裝過多個核心版本,則可能會找到多個檔案,選擇當前系統核心版本的就可以了。比如我的32位syscall table檔案路徑和前幾個呼叫號如下:

head -n10 /usr/src/linux-headers-3.16

.0-33-generic/arch/x86/include/generated/uapi/asm/unistd_32.h

#ifndef _asm_x86_unistd_32_h

#define _asm_x86_unistd_32_h 1

#define __nr_restart_syscall 0

#define __nr_exit 1

#define __nr_fork 2

#define __nr_read 3

#define __nr_write 4

#define __nr_open 5

#define __nr_close 6

而對應的64位syscall內容如下:

head -n20 /usr/include/x86_64-linux-gnu/asm/unistd_64.h

#ifndef _asm_x86_unistd_64_h

#define _asm_x86_unistd_64_h 1

#define __nr_read 0

#define __nr_write 1

#define __nr_open 2

#define __nr_close 3

#define __nr_stat 4

#define __nr_fstat 5

#define __nr_lstat 6

#define __nr_poll 7

#define __nr_lseek 8

#define __nr_mmap 9

#define __nr_mprotect 10

#define __nr_munmap 11

#define __nr_brk 12

#define __nr_rt_sigaction 13

#define __nr_rt_sigprocmask 14

#define __nr_rt_sigreturn 15

#define __nr_ioctl 16

注意32位中wrtie呼叫號是4,而64位下是1,這個千萬別搞錯了,否則自然一塌糊塗。

linux下64位彙編的系統呼叫 1

現在基本上系統都是64位了,而64位系統下的彙編和32位有了較大的變化,無論是系統呼叫的介面還是c標準庫的介面都和32位彙編有所不同 下面簡單談一下在64位linux下如何利用彙編直接呼叫系統呼叫。需要準備的有 1.一台linux機器 我的系統是ubuntu 14.10 x64版 2.還要乙個彙編器...

linux下64位彙編的系統呼叫 3

背景知識基本交代清楚了,下面我們實際寫乙個小例子看一下。的功能很簡單,顯示一行文字,然後退出。我們使用了syscall中的write和exit呼叫,查一下前面的呼叫號和引數,我們初步總結如下 write 即sys write 呼叫號為1,需傳遞3個引數 unsigned int fd const c...

linux下64位彙編的系統呼叫 5

include include include include include include include include include include int main void return 0 前面介紹過幾個linux下的整合除錯環境,這裡我們還是用codelite而不用codebloc...