显然,我们这里随便输入的“12345678”有点问题,继续执行的话会出错。不过,当程序会把我们的输入当成指令执行,ShellCode就有用武之地了。
首先我们需要去找一个ShellCode,我们希望ShellCode可以打开一个Shell以便于远程控制只对我们暴露了一个10001端口的Docker环境,而且ShellCode的大小不能超过传递给read函数的参数,即0x20=32。我们通过著名的shell-storm.org的ShellCode数据库shell-storm.org/shellcode/找到了一段符合条件的ShellCode。
21个字节的执行sh的ShellCode,点开一看里面还有代码和介绍。我们先不管这些介绍,把ShellCode取出来。
使用Pwntools库把ShellCode作为输入传递给程序,尝试使用io.interactive( )与程序进行交互,发现可以执行shell命令。
当然,shell-storm上还有可以执行其他功能如关机,进程炸弹,读取/etc/passwd等的ShellCode,大家也可以试一下。总而言之,ShellCode是一段可以执行特定功能的神秘代码。那么ShellCode是怎么被编写出来,又是怎么执行指定操作的呢?我们继续来深挖下去。
ShellCode的原理
这次我们直接把断点下在call eax上,然后F7跟进。