32位和64位的syscall原理都是一样 只有传参和调用存在差异,以下一起说,做个对比 32位系统调用使用 " int 80h " 64位系统调用使用 " syscall " (汇编代码就是syscall 直接ROPgadget--only查找即可) 32的系统调用号与64位的不大一样 使用的时候最好百度一下 比如 32位 #define __NR_execve 11 64位 #define __NR_execve 59 32位的系统调用号放在eax 传参依次是 EBX、ECX、EDX、ESI、EDI、EBP 64位的系统调用号放在rax 传参依次是 RDI、RSI、RDX、R10、R8、R9 (和64位函数传参一样) 一个64位的题目 backdoor Weekly 1 Challenge 2 题目说的很清楚了 构造ROP chain 没有/bin/sh字眼 只能自己gets 到bss区域 然后调用execve (想过使用shellcode 但是没找到合适的可执行地址) from pwn import * # io=process('./chall') elf=ELF('./chall') io=remote('hack.bckdr.in',15102) # context(os='linux', arch='amd64', log_level='debug') #