1
Beginner's Corner / Re: Problem to understand execution of payload (shellcode)
« on: October 06, 2015, 03:18:50 pm »
Thanks for your answer, WormKill.
Hmm, seems a bit weird, cause in the book I'm reading, the RIP was overwritten with a fixed address of another function, to control the execution-flow of another example-program, but probably the stack-size varies more with a complex program, and therefore you should always avoid the use of hardcoded addresses.
To that JMP/Call-trick:
Considering the following situation (c&p from Smashing the Stack..., pastebin is more readable):
http://pastebin.com/dQpcgrwf
Assuming the stack starts at address 0xFF, and that S
stands for the code we want to execute the stack would then look like this:
bottom of DDDDDDDDEEEEEEEEEEEE EEEE FFFF FFFF FFFF FFFF top of
memory 89ABCDEF0123456789AB CDEF 0123 4567 89AB CDEF memory
buffer sfp ret a b c
<------ [SSSSSSSSSSSSSSSSSSSS][SSSS][0xD8][0x01][0x02][0x03]
^ |
|____________________________|
top of bottom of
stack stack
That's how I'd have done it before I got to know that the stack-size can vary.
The following is how it is done correctly
http://pastebin.com/VxUE7vbu
The CALL instruction can simply call the
start of our code above. Assuming now that J stands for the JMP instruction,
C for the CALL instruction, and s for the string, the execution flow would
now be:
bottom of DDDDDDDDEEEEEEEEEEEE EEEE FFFF FFFF FFFF FFFF top of
memory 89ABCDEF0123456789AB CDEF 0123 4567 89AB CDEF memory
buffer sfp ret a b c
<------ [JJSSSSSSSSSSSSSSCCss][ssss][0xD8][0x01][0x02][0x03]
^|^ ^| |
|||_____________||____________| (1)
(2) ||_____________||
|______________| (3)
top of bottom of
stack stack
How you can see, the return address (or RIP, that's how it's called in my book), still contains the absolute address of the buffer's first element. So that JMP/CALL instructions are useless.
Hmm, seems a bit weird, cause in the book I'm reading, the RIP was overwritten with a fixed address of another function, to control the execution-flow of another example-program, but probably the stack-size varies more with a complex program, and therefore you should always avoid the use of hardcoded addresses.
To that JMP/Call-trick:
Considering the following situation (c&p from Smashing the Stack..., pastebin is more readable):
http://pastebin.com/dQpcgrwf
Assuming the stack starts at address 0xFF, and that S
stands for the code we want to execute the stack would then look like this:
bottom of DDDDDDDDEEEEEEEEEEEE EEEE FFFF FFFF FFFF FFFF top of
memory 89ABCDEF0123456789AB CDEF 0123 4567 89AB CDEF memory
buffer sfp ret a b c
<------ [SSSSSSSSSSSSSSSSSSSS][SSSS][0xD8][0x01][0x02][0x03]
^ |
|____________________________|
top of bottom of
stack stack
That's how I'd have done it before I got to know that the stack-size can vary.
The following is how it is done correctly
http://pastebin.com/VxUE7vbu
The CALL instruction can simply call the
start of our code above. Assuming now that J stands for the JMP instruction,
C for the CALL instruction, and s for the string, the execution flow would
now be:
bottom of DDDDDDDDEEEEEEEEEEEE EEEE FFFF FFFF FFFF FFFF top of
memory 89ABCDEF0123456789AB CDEF 0123 4567 89AB CDEF memory
buffer sfp ret a b c
<------ [JJSSSSSSSSSSSSSSCCss][ssss][0xD8][0x01][0x02][0x03]
^|^ ^| |
|||_____________||____________| (1)
(2) ||_____________||
|______________| (3)
top of bottom of
stack stack
How you can see, the return address (or RIP, that's how it's called in my book), still contains the absolute address of the buffer's first element. So that JMP/CALL instructions are useless.