arm shellcode 编写详析1
生活随笔
收集整理的這篇文章主要介紹了
arm shellcode 编写详析1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在編寫arm shell code 之前,先介紹下arm中r0-r15寄存器的主要用途:
Register Alt. Name Usage
r0 a1 First function argument Integer function result Scratch register
r1 a2 Second function argument Scratch register
r2 a3 Third function argument Scratch register
r3 a4 Fourth function argument Scratch registerr4 v1 Register variable
r5 v2 Register variable
r6 v3 Register variable
r7 v4 Register variable
r8 v5 Register variable
r9 v6
rfp Register variable Real frame pointerr10 sl Stack limit
r11 fp Argument pointer
r12 ip Temporary workspace
r13 sp Stack pointer
r14 lr Link register Workspace
r15 pc Program counte
r0-r3 一般用于傳遞函數參數,從左到右分別為參數1-參數4。r4-r9一般作為臨時變量。在另一方面r7用來存儲syscall的地址r13指向棧頂, r15指向下一條執行指令的地址。如果我們想要編寫shellcode功能函數的話,我們需要先查找 syscall的地址,譬如_write和_exit函數,我們可以查找NDK里面的文件\android-ndk-r10e\platforms\android-19\arch-arm\usr\include\asm\unistd.h里面有:
#define __NR_write (__NR_SYSCALL_BASE+ 4)
#define __NR_writev (__NR_SYSCALL_BASE+146)
#define __NR_pwrite64 (__NR_SYSCALL_BASE+181)
#define __NR_pciconfig_write (__NR_SYSCALL_BASE+273)
#define __NR_exit (__NR_SYSCALL_BASE+ 1)
#define __NR_exit_group (__NR_SYSCALL_BASE+248)
然后我們可以建立maintest.s文件里面簡單的用上_write和_exit
.section .text
.global _start_start:# _write()mov r2, #16 //sizeadr r1, ascii //void* bufmov r0, #0x1 //fdmov r7, #0x4 //syscall addrsvc 0# _exit()sub r0, r0, r0mov r7, $0x1svc 0ascii:
.string "hello shell\n".balign 4
在當前目錄建立一個編譯的批處理命令:
E:\andorid\android-ndk-r10e\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\arm-linux-androideabi\bin\as.exe -o .\maintest.o .\maintest.s
E:\andorid\android-ndk-r10e\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\arm-linux-androideabi\bin\ld.exe -o .\maintest .\maintest.o
adb push E:\task\dirtycow\androidtest\maintest /data/local/tmp/
adb shell "chmod 777 /data/local/tmp/maintest"
pause
運行結果:
E:\task\dirtycow\androidtest>E:\andorid\android-ndk-r10e\toolchains\arm-linux-an
droideabi-4.8\prebuilt\windows-x86_64\arm-linux-androideabi\bin\as.exe -o .\main
test.o .\maintest.s
.\maintest.s: Assembler messages:
.\maintest.s: Warning: end of file not at end of a line; newline insertedE:\task\dirtycow\androidtest>E:\andorid\android-ndk-r10e\toolchains\arm-linux-an
droideabi-4.8\prebuilt\windows-x86_64\arm-linux-androideabi\bin\ld.exe -o .\main
test .\maintest.oE:\task\dirtycow\androidtest>adb push E:\task\dirtycow\androidtest\maintest /dat
a/local/tmp/
[100%] /data/local/tmp/maintestE:\task\dirtycow\androidtest>adb shell "chmod 777 /data/local/tmp/maintest"E:\task\dirtycow\androidtest>pause
請按任意鍵繼續. . .
C:\Users\Administrator>adb shell
shell@pisces:/ $ /data/local/tmp/maintest
hello shellshell@pisces:/ $
總結
以上是生活随笔為你收集整理的arm shellcode 编写详析1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最优化学习笔记(二)一维搜索
- 下一篇: Modbus协议栈开发笔记之四:Modb