Thursday, September 23, 2010

Executing a ByteString

Why not!

{-# LANGUAGE ForeignFunctionInterface #-}
import Foreign ( FunPtr, withForeignPtr, castPtrToFunPtr )
import System ( getArgs )
import qualified Data.ByteString as B ( pack, ByteString )
import qualified Data.ByteString.Internal as B ( toForeignPtr )

payload :: B.ByteString
payload = B.pack [
0x55, -- push %rbp
0x48, 0x89, 0xe5, -- mov %rsp,%rbp
0x89, 0x7d, 0xec, -- mov %edi,-0x14(%rbp)
0xc7, 0x45, 0xfc,
1, 0, 0, 0, -- movl $0x1,-0x4(%rbp)
0xeb, 0x0e, -- jmp 1e <fact+0x1e>
0x8b, 0x45, 0xfc, -- mov -0x4(%rbp),%eax
0x0f, 0xaf, 0x45, 0xec, -- imul -0x14(%rbp),%eax
0x89, 0x45, 0xfc, -- mov %eax,-0x4(%rbp)
0x83, 0x6d, 0xec, 1, -- subl $0x1,-0x14(%rbp)
0x83, 0x7d, 0xec, 1, -- cmpl $0x1,-0x14(%rbp)
0x7f, 0xec, -- jg 10 <fact+0x10>
0x8b, 0x45, 0xfc, -- mov -0x4(%rbp),%eax
0xc9, -- leaveq
0xc3 ] -- retq

type F = Int -> Int

foreign import ccall "dynamic"
getF :: FunPtr F -> F

main :: IO ()
main = do
[s] <- getArgs
n <- readIO s
let (fptr, _, _) = B.toForeignPtr payload
withForeignPtr fptr $ \ptr -> do
let f = getF $ castPtrToFunPtr ptr
print $ f n

Testing it:

$ runhaskell foo.hs 6
720

This code will only work on x86-64.

10 comments:

  1. For completeness, how about posting the code for getF?

    ReplyDelete
  2. Yitz:

    This code is complete. 'foreign import "dynamic"' is a special type of import, producing a function which turns function pointers into Haskell functions.

    This might involve some extra C / Cmm code, but it's generated automatically by GHC.

    ReplyDelete
  3. Now we just need a quasiquoter that calls an assembler to make inline assembly :)

    ReplyDelete
  4. copumpkin: you can try out Harpy (search for package harpy on Hackage) for an assembler DSL for 32-bit Intel code.

    ReplyDelete
  5. >> Why not!

    For security reasons, of course !
    Unless you want Haskell to be the new C, as far as execution of arbitrary code is concerned…

    ReplyDelete
  6. To where to find wps pin on hp printer between HP printer and PC, utilizing a WPS Pin is

    fundamental. Become acquainted with how to discover it and make it being used.

    ReplyDelete
  7. TS Inter 1st & 2nd Year Model Paper 2022 Available Students you can Download in PDF format form this web page below given links. BIE Telangana Regular and Private Students Prepare their Exam from these Sample Papers, Students have to Register for Appearing in Public Exam 2022. TS 12th Model Paper 2022 So if you are also among those students who have Registered them self as a Regular or Private Student are Suggested to Download these Sakshi TS Inter 1st & 2nd Year Sample Paper 2022 must Prepare all Subjects. Model Papers are very helpful Material that is Provided by the official education Board.

    ReplyDelete
  8. ปัจจุบันแมวได้รับความนิยมในการเลี้ยงหลายสายพันธุ์มากขึ้น ไม่ว่าจะเป็นแมวสายพันธุ์ต่างประเทศ หรือแมวสายพันธุ์ไทย เเมวสายพันธุ์ไทยนั้นก็มีความน่ารัก สวยงามที่ไม่เเพ้สายพันธุ์ต่างประเทศ เราจะพาทุกท่านไปรู้จักกับ เเมวสายพันธุ์ไทย ข้อมูลเพิ่ม ที่เหล่าทาสไม่ควรพลาด !!

    ReplyDelete
  9. Gutt Websäit : Zonahobisaya
    Gutt Websäit : Zonahobisaya
    Gutt Websäit : Biodata
    Gutt Websäit : Sinopsis Film Terbaru
    Gutt Websäit : Resep
    Gutt Websäit : Profil
    Gutt Websäit : Zonahobisaya
    Gutt Websäit : Zonahobisaya

    ReplyDelete
  10. รวมเรื่องราวของสัตว์เลี้ยงเเสนน่ารัก ศึกษาพฤติกรรมสัตว์เลี้ยงของคุณได้ง่ายๆ ไปกับ evanasa https://evanasa.com/ ไม่วา่จะเป็นน้องหมา น้องเเมวเราก็รวบรวมไว้ที่นี่เเล้ว สัตว์เเปลกจากทั่วทุกมุมโลก ต่างก็รวมไว้ที่นี่ เพิ่มความรู้ให้กับทาสเกี่ยวกับสัตว์เลี้ยง ไปกับเว็บไซต์ของเราได้เลย.

    ReplyDelete