易码技术论坛

 找回密码
 加入易码
搜索
查看: 562176|回复: 17

星星上很可能可以动态执行自定义的LAVA伪指令哦

[复制链接]
发表于 2007-7-24 08:05:54 | 显示全部楼层
下午,回去试试
发表于 2007-7-24 09:15:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2007-7-24 15:26:59 | 显示全部楼层
不明白
 楼主| 发表于 2007-7-24 18:36:17 | 显示全部楼层
上面那段代码如果在屏幕上输出"hello, world!"就成功.
成功的话可以做出一个速度还可以的LAVA调试器,纯LAVA做的话没速度啊,而且可变参数的函数不好处理啊,所以像sprintf这样的让解释器自己执行就问题不大了.
发表于 2007-7-24 19:09:29 | 显示全部楼层
还是不明白
 楼主| 发表于 2007-7-24 19:18:00 | 显示全部楼层
代码中hijackTo()执行完后会返回到参数中指定的文件位置而不是本来应该回到的地址,利用这个执行自己定义的字节码,就是这么回事.
问题是我在PC上执行时虚拟机必挂,又没有WQX,所以不知道实机的情况,就是这样.
发表于 2007-7-24 19:52:09 | 显示全部楼层
不明白有什么用
 楼主| 发表于 2007-7-24 19:59:12 | 显示全部楼层
累死了...
就是想知道别人的代码都干了些什么,反编译是不现实了,字节码这个层面的还是可以忍受的,知道OllyDebug、SoftICE什么的吧。
发表于 2007-7-24 19:59:27 | 显示全部楼层
不可能的,由于ggv文件系统的原因,写文件是不会写在原来的nand块上的,只会将原来的块标记为空闲,然后重新写到另一块空闲的块上,而lavax是直接读nand块的,记录的信息是刚刚运行程序时的nand块,而不包括新的nand块。
发表于 2007-7-24 20:00:55 | 显示全部楼层
所以无法运行在程序运行期间写入的代码。
发表于 2007-7-24 20:02:23 | 显示全部楼层
当然如果懂的ggv文件系统的话,可以很轻易实现这个功能。甚至可以实现int Exec(addr AppName,addr param,int set);功能。
 楼主| 发表于 2007-7-24 20:04:26 | 显示全部楼层
退一步说,我可以把要调试的文件预先附加到文件尾,再重新运行,也可以以此种方式调试啊,只要修正某些跳转指令(如0x3d)和类似0x3c使用了绝对地址的指令就可以了。
 楼主| 发表于 2007-7-24 20:08:02 | 显示全部楼层
引用第11楼yan2007-07-24 20:02发表的“”:
当然如果懂的ggv文件系统的话,可以很轻易实现这个功能。甚至可以实现int Exec(addr AppName,addr param,int set);功能。
这个在LAVA层面上不好实现吧,LAVA应该不可以直接操作闪存的。
GGV的那个文件系统结构很简单,好像大部分人都知道。
发表于 2007-7-24 20:08:49 | 显示全部楼层
这样做只能在wqx上试。要调试,在电脑上比wqx好多了。不过也不失为一个号方法。
发表于 2007-7-24 20:10:14 | 显示全部楼层
引用第8楼ttheaven2007-07-24 19:59发表的“”:
累死了...
就是想知道别人的代码都干了些什么,反编译是不现实了,字节码这个层面的还是可以忍受的,知道OllyDebug、SoftICE什么的吧。
lz....lava破解.ODAY.溢出应用^_^
发表于 2007-7-24 20:14:34 | 显示全部楼层
以前不有个GVB的动态代码吗?
 楼主| 发表于 2007-7-25 18:56:42 | 显示全部楼层
GVB的指令读到了内存中,LAVA的指令是基于文件的,只有个缓冲。
 楼主| 发表于 2007-7-22 18:57:42 | 显示全部楼层 |阅读模式
由于我没有星星了,导致我所有的东西在电脑上完成,但是电脑上的虚拟机和星星上的又不一样,所以没有能得到最终结果,但本人认为可行。
原理:
函数在执行前会先将5个字节的数据进栈,它们是将被执行的函数使用的内存的基址和返回地址,是可以修改的。
思路:
因为可以劫持函数的返回地址,又在电脑上的虚拟机上发现可以追加被载入的LAVA文件(其他方式试过了不行),所以由此写了个程序测试。
不过在电脑上的运行结果是虚拟机崩溃,****不能为read,分析原因可能是因为虚拟机在载入文件前分配了与LAVA文件大小相同的内存,而我把程序劫持到了超出此大小的地址,虚拟机访问了不该访问的内存,故挂掉了,LEE大概也没想到会发生这种事吧。而星星上的虚拟机在使用LAVA文件时好像并不是打开,而是直接读的闪存,故应该可以在“运行”时读写自身。
星星还在的帮个忙运行一下,看看结果是不是打印“hello, world!”:P
  1. /*
  2. 例程(确定无误):
  3. void main()
  4. {
  5.    printf("abc");
  6.    hijackTo(16);
  7. }
  8. 效果是不停打印出"abc"。
  9. */
  10. /*
  11. 以下待查:
  12. invoke printf, 1, "hello, world!"
  13. push 0
  14. ret
  15. */
  16. char code[] = {0x0D, 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20,
  17. 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x00, 0x01,
  18. 0x01, 0x82, 0x01, 0x00, 0x3f};
  19. //取得此函数执行后要返回的地址
  20. /*
  21. long getIPtr()
  22. {
  23.    long IPtr;
  24.    *(&IPtr) = *(&IPtr -5);
  25.    *(&IPtr + 1) = *(&IPtr - 4);
  26.    *(&IPtr + 2) = *(&IPtr - 3);
  27.    *(&IPtr + 3) = 0;
  28.    return IPtr;
  29. }
  30. */
  31. //修改函数执行后要返回的地址
  32. //相当于运行时的goto
  33. void hijackTo(long newIPtr)
  34. {
  35.    *(&newIPtr - 5) = *(&newIPtr);
  36.    *(&newIPtr - 4) = *(&newIPtr + 1);
  37.    *(&newIPtr - 3) = *(&newIPtr + 2);
  38. }
  39. //自定义byte code的返回值要放在栈顶,会由exec子程式返回
  40. //因为种种原因,打开方式是APPEND
  41. //随着使用次数增加,文件本身大小会变大
  42. long execMyBytes(long bytes, long size)
  43. {
  44.    char fp;
  45.    long newIPtr;
  46.    if(!size)
  47.       return -1;
  48.    //此文件名称
  49.    if((fp=fopen("test.lav", "ab+")) == 0)
  50.    {
  51.       printf("file open err\n");
  52.       return -1;
  53.    }
  54.    newIPtr = ftell(fp);
  55.    if(fwrite(bytes, 1, size, fp) != size)
  56.    {
  57.       printf("file append err\n");
  58.       fclose(fp);
  59.       return -1;
  60.    }
  61.    fclose(fp);
  62.    hijackTo(newIPtr);
  63.    //不用RETURN
  64. }
  65. void main()
  66. {
  67.    execMyBytes(code, 21);
  68. }
复制代码
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-3-29 04:26 , Processed in 0.013088 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表