Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to change a value inside a Lua bytecode? How? Any idea?

I got a script that is no longer supported and I'm looking for a way to change the value of a variable in it... The script is encrypted (loadstring/bytecode/something like that) e.g.: loadstring('\27\76\117\97\81\0\1\4\4\4\8\0\')

I can find what I want to change (through notepad after I compile the script), but if I try to change the value, the script won't work, if I change and try to recompile it still won't work: "luac: Testing09.lua: unexpected end in precompiled chunk" ...

Any ideas? I did something like that with a program long a go using ollydbg but I can't use it with lua scripts... I'm kinda lost here, doing some Googling for quite a while couldn't find a way... Any ideas?

like image 322
user2857670 Avatar asked Mar 22 '23 03:03

user2857670


1 Answers

It is easy to change a string in a Lua bytecode. You just have to adjust the length of the string after you change it. The length comes before the string. It probably takes four or eight bytes just before the string, depending on whether you have a 32-bit or 64-bit platform. The length is stored in the endianness of the machine where the bytecode was generated. Note that strings include a trailing '\0' and this counts in the length.

Perhaps it is easier to just copy some bytes directly. Write this file

return "this is the new string you want" 

Generate bytecode from it with luac and look at an dump of luac.out and locate the string and its length. Copy those bytes to the original file.

I don't know whether notepad handles binary data. if it doesn't, you'll need an hex editor to do this.

Another solution is to write a Lua program that reads the bytecode as a strings, generate bytecode for return "this is the new string you want", perform the change in the original bytecode using string operations and write it back to file.

You can also try my bytecode inspector library lbci, which allows you to change constants in functions. You'd load the bytecode (but not execute it), and use setconstant after locating the constant that has the string you want to change.

In all, there is some fun to be had here...

like image 149
lhf Avatar answered Mar 30 '23 00:03

lhf