可见字符shellcode主要是为了应付有的题目会限制用户输入的字符的范围,遇到这种情况 详细信息可以查看这篇博客

ida64打开发现不能f5反编译,只能硬读汇编

从后往前读一下汇编,最底下是一个跳转,而1那里就是跳转的条件,将rbp+var_8和0比较,大于0则跳转到loc_11AC等于0则从红色线路跳转 2那里则说明了rbp+var_8的值就是eax的值 3是把buf的值弹进了rsi寄存器 4是把rbp+buf的值写进rax,而buf有0x400字节,eax是rax低32位,所以eax肯定是大于0的正常的情况下我们会经历一系列的比较跳转

这里说一下,al是ax的低8位,ax是eax的低16位,也就是说假设eax为12345678h,那么al就是78h,后面这一系列跳转其实就是将我们输入的值的ascii码进行比较 如果第一位全部比较完并且符合要求的话会跳转到这里

这里会将我们要比较的值+1位并且重新开始比较
这里贴不同比较情况的跳转指令
INC 自增1 increase
DEC 自减1 decrease
JGE 前>=后 Jump if greater or equal
JG 前>后 Jump if greater
JLE 前<=后 Jump if less or equal
JL 前<后 Jump if less
JNE 前不等于后 Jump if not equal
JE 前等于后 Jump if equal
最后发现我们用来构造shellcode的字符的ascii码的范围必须在0x30-0x5f以及0x61-0x7f里才可以
首先利用pwntool生成shellcode
from pwn import *
context.arch='amd64'
sc = shellcraft.sh()
print(asm(sc))

jhH\\\\xb8/bin///sPH\\\\x89\\\\xe7hri\\\\x01\\\\x01\\\\x814$\\\\x01\\\\x01\\\\x01\\\\x011\\\\xf6Vj\\\\x08^H\\\\x01\\\\xe6VH\\\\x89\\\\xe61\\\\xd2j;X\\\\x0f\\\\x05

这里我没找到py3的alpha3,所以直接下了个py2