Behemoth7

Posted by rk700 on July 6, 2014

这道题稍微和之前不太一样,在main开始时先push ebp, 又push edi, 然后and esp 0xfffffff0, sub esp 230h。但ida这里没搞清楚,字符数组是在esp+24h处,但ida显示的是ebp+210h,明显不对,估计是因为又push edi的原因。所以直接看反汇编有时确实容易出错,这种情况下还是要直接看汇编。

首先是把环境变量都清空了,所以只能把shellcode放在argv里了。另外,会检查前512个字符是否包含非字母,应该可以写出只有字母的shellcode,但我没有用那种方法。也就是把shellcode放在紧挨着ebp前面的缝隙处。检查发现,shellcode最长只能有12+8+4=24byte;顶多再加一个byte,也就是返回地址的最低位,而且如果这么做的话,前面的要用NOP来填充了

另一方面,由于shellcode金挨着返回地址,我们还必须保护他,也就是要先把栈往上推。这样一来,之前一直用的那个版本就太长了,于是这里我让他执行./sh,然后把/bin/sh链接到当前目录下

shellcode所在的地址还是通过ebp的地址算出,再次提醒下要保持参数个数及长度都相同

汇编代码如下

BITS 32

xor eax, eax
sub esp, 0x28 ;protect our code
push eax
mov edx, esp
push 0x68732f2e ;./sh
mov ebx, esp
push eax
push ebx
mov ecx, esp
mov al, 11
int 0x80