現在基本上系統都是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...