shellcode tricks

常用系统调用号 syscall 64位 0->read 1->write 2->open 5->fstat 9->mmap 0xa->mprotect 0xf->rt_sigreturn 0x3b->execve 0x5a->chmod int 0x80 32位 3->read 4->write 5->open 0xb->execve

  • 有时候受字长限制可以考虑eax,ax,al这种寄存器,让shellcode变短
  • cdq指令让edx归0
  • xor eax,eax这种来清0
  • 很多情况下受字长限制的shellcode很可能再read一次,或者mmap,myprotect开辟新的空间
  • 注意残留寄存器的值是否可以利用
  • 可以用\x90也就是nop过渡,gs也可以过渡
  • push idata,idata有范围限制,最大为32位,不能再大了
  • xchg eax,esi \x96 一个字节 交换两个寄存器的值
  • 要充分利用残留的寄存器的值来xor出syscall
  • 一般情况下限制了输入长度的shellcode都是要调用read的,题目中的read还进行了检查,但是自己实现的read没有检查并且可以读入很多。一次read不够就两次,pop rdx可以设置rdx为栈上的值,这一般可以很大,并且不用像mov dx,0x50那样会通不过字符检查,jmp rax可以跳转到一个很大的地方执行
  • 要合理地利用栈上残留的数据,利用push pop得到该数据
  • jmp指令,jmp $+2