Donations

BTC: bc1qxv3stg0xha9upurf7h4aqnmg3xjn3h0zk28kpe

ETH: 0x01870296774Fb0A2DbF9b44d2E6a57fb8Ccea070

LTC: LQ44CP6xDDkX5bAiKd3yqmDB4c23U7orrQ

DOGE: DCpu9v1bkTXj8VKUDG97LHdV2qipDPyZsR

ADA: addr1qx4q7348dv2ju5zshee9ru23ssmqhyyjlnxe0xlezjq5we42par2w6c49eg9p0nj28c4rppkpwgf9lxdj7dlj9ypganqtmuu2p

quinta-feira, 18 de janeiro de 2024

Exploiting Golang Unsafe Pointers


There are situations when c interacts with golang for example in a library, and its possible to exploit a golang function writing raw memory using an unsafe.Pointer() parameter.

When golang receive a null terminated string on a *C.Char parameter, can be converted to golang s tring with  s2 := C.GoString(s1) we can do string operations with s2 safelly if the null byte is there.

When golang receives a pointer to a buffer on an unsafe.Pointer() and the length of the buffer on a C.int, if the length is not cheated can be converted to a []byte safelly with b := C.GoBytes(buf,sz)

Buuut what happens if golang receives a pointer to a buffer on an unsafe.Pointer() and is an OUT variable? the golang routine has to write on this pointer unsafelly for example we can create a golangs memcpy in the following way:



We convert to uintptr for indexing the pointer and then convert again to pointer casted to a byte pointer dereferenced and every byte is writed in this way.

If b is controlled, the memory can be written and the return pointer of main.main or whatever function can be modified.

https://play.golang.org/p/HppcVpLfuMf


The return addres can be pinpointed, for example 0x41 buffer 0x42 address:



We can reproduce it simulating the buffer from golang in this way:


we can dump the address of a function and redirect the execution to it:


https://play.golang.org/p/7htJHJp8gUJ

In this way it's possible to build a rop chain using golang runtime to unprotect a shellcode.

Related word


0 comentários:

Postar um comentário

Donations

BTC: bc1qxv3stg0xha9upurf7h4aqnmg3xjn3h0zk28kpe

ETH: 0x01870296774Fb0A2DbF9b44d2E6a57fb8Ccea070

LTC: LQ44CP6xDDkX5bAiKd3yqmDB4c23U7orrQ

DOGE: DCpu9v1bkTXj8VKUDG97LHdV2qipDPyZsR

ADA: addr1qx4q7348dv2ju5zshee9ru23ssmqhyyjlnxe0xlezjq5we42par2w6c49eg9p0nj28c4rppkpwgf9lxdj7dlj9ypganqtmuu2p