There are a couple of ways to do this.
If you're setting the image position when the passage is first displayed, it's probably easiest to use attribute directives to set the style, like this:
<<set _picPos = "left: 300px; top: 313px;">>
<img src="data:image/jpg;base64,iVBORw...5CYII=" @style="_picPos + 'width: 125px; height: 125px; position: absolute;'">
NOTE: There was a bugfix for attribute directives in SugarCube v2.23.5, so you might want to update if you have an older version (the current version as of this posting is v2.27.0). The download is here, and the upgrade instructions are here.
If you want to have them click a button and then have the image move without loading a new passage, you can use jQuery to do that. First, add an ID to the image, such as id="boat", so that you can uniquely identify the image element. Then, in a button click or something like that, you'd do this:
<<set _tpos = "313px">>
<<run $("#boat").css( { top: _tpos, left: "300px" } )>>
and that would dynamically change the top and left position of the element that has an ID of "boat". You can see other jQuery functions here.
If you want to use jQuery when the passage loads, it's a bit trickier, because you have to time it so that the element exists when you try to modify it. To do that you'd put something like this in your passage:
<<set _tpos = "300px">><<set _lpos = "315px">>
<<run $(document).one(':passagerender', function (ev) { $(ev.content).find("#boat").css({ top: _tpos, left: _lpos }) })>>
That waits for the current passage to be in the "render" state, at which point it can use ev.content to access and modify the elements on the page. See the :passage render event for details.
Hope that helps! :-)
P.S. I wrote this without testing the code, so there may be accidental bugs. If there are, let me know and I'll fix them.