今天我知道shellcode了,原来我之前编的那些远程线程,给pe添的代码都叫shellcode,就是有通用性的都叫shellcode
书上给了个c写的shell挖!痛苦死,一大堆限制什么不用静态量,switch只用三分支,还有连接选项要去掉某某,定义的时候用一堆宏,对齐也是,但是有一点很明显,就是他要逃避重定位!!
好吧,竟然他能实现就是好的,至少我可捂不出能完美躲避重定位的办法,我喜欢汇编.
重定位的文章之前写过一篇了,有兴趣去看看吧.总之定位api呢,又多了总方法找kernel32,就是遍历SEH链到链尾,handler就会指向kernel32的函数叫啥UnhandledExceptionFilter.后面都一样了还有一种方法fs:[30h],它指向peb,peb里面有个ProcessModuleInfo
进入正题.
首先大部分的溢出都是靠字符串输入搞的,所以先输入一串,然后到堆栈里找,找到了,好第一个字节就是shellcode的起点,以后要ret到它,或者异常到它,然后找原来的ebp,用0012比较好找(我猜,堆栈位置的前两字节),或者妈的执行到ret看他堆栈弹到哪.,好这下知道ret的地址了,接下来就漫漫构造吧,不过还有一个小问题,必须避免0的出现,因为它让code结束(字符串结束),所以要在你的shellcode里面找个没出现过的字节值(编个循环来找吧),然后对你整个code异或,当然你要在code前加解或(异或)的代码,不要告诉我你解或的代码里有0
之前说的那个改ret地址,还可以改SEH的异常处理函数的地址,搜索mov fs:[0],esp或者push fs:[0]下断,要不你搜堆栈里的地址-4就是值的地方
一切指针都是可能惊喜的地方,利用api的指针参数也可以
如果有对象的输入操作,就算它在堆上,也可以尽其空间,
对于特定系统,吗的api都不用重定位,直接call,
可以修改的范围达到父函数的变量或者参数,你要取舍改或不改(你先把原值调查清楚吧),考虑shell的功能,那些可以把shellcode移到更安全的地方,还原之前的变量等等,心情好给shellcode安个seh