网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月13日漏签0天
fx-es(ms)吧 关注:17,262贴子:310,846
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 18回复贴,共1页
<<返回fx-es(ms)吧
>0< 加载中...

[991CNX VerC] rop内存编辑器

  • 只看楼主
  • 收藏

  • 回复
  • EwTE_H
  • 991CNX
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个编辑器可以编辑任意位置的内存,编辑成任何值,也就是说,rop的不可刷字符限制和200字节限制都不复存在了!代码如下:(132an)

代码解释楼下会发,lz码字慢


  • EwTE_H
  • 991CNX
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
下面开始沿着执行链分行解说
循环外
D59A 72 0D _2 __ DA D2 //er14 = D2DA
D560 7A 23 _2 __ //jump er14; pop qr8; pop qr0
D2DA _1 __ __ __ 26 8F E0 D8 //qr8,注意er14=D8E0
D2E2 16 E2 _0 __ CE 8B _1 __ //qr0,并没有什么用
D2EA 34 61 _1 __ A7 D9 01 __ //er0 = D9A7; r2 = 01
D2F2 D2 03 _2 __ //*er0 = r2([D9A7]=01)
D2F6 34 61 _1 __ A6 D8 3A D1 //er0 = D8A6; er2 = D13A
D2FE CE EB E0 D8 01 01 //memcpy(er0, er2, 0101); \
jump er14; pop xr4; pop qr8
接下来进入循环


2025-06-13 13:07:03
广告
  • EwTE_H
  • 991CNX
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
D8E0 //xr4,没用
D8E4 //qr8,没用
D8EC 6C C0 _0 __ 6C D9 //er8 = D96C(*ptr)
D8F2 12 88 _1 __ (ptr) //er2 = ptr; r0=1,这个ptr是从D18A处复制过来的
D8F8 28 8F _0 __ 14 D2 __ __ //*er8 = er2; pop xr8([D96C]=ptr)
D900 28 8F _0 __ __ __ __ __ //*er8 = er2; pop xr8([D214]=ptr)
D908 AE 21 _2 __ //print *er2,在第r0行
D90C 06 87 _0 __ //flush
D910 A8 21 _1 __ 1E D9 //er0 = D91E(*key)
D916 48 F7 _0 __ //waitkey,放在*er0
D91A C2 8F _0 __ (key) //er2 = key
D920 58 4C _1 __ //pop xr4; pop qr8; 这是为了给D59A的跳转代码腾地方
D924 72 0D _2 __ DA D2 7A 23 _2 __ 44 D9 //注意er14=D944
D930 6C C0 _0 __ 44 D9 //er8 = D944(*key)
D936 28 8F _0 __ 6E D9 FD BF //*er8 = er2; pop xr8 \
([D944]=key, er8=D96E, er10=BFFD)
D93E 26 8F D0 41 __ __ (key) //er2 += er10; *er8 = er2; pop xr8 \
([D96E]=key, er2=key+BFFD, er10=key)
D946 C2 8F 40 D9 2C 48 //er2 = 482C
D94C 32 33 _2 __ //r0 = r11; jump er14; pop xr4; pop qr8 \
这一步把奇数位的寄存器复制到偶数位
D944 (key) C2 8F //xr4,并没有什么用
D948 40 D9 2C 48 32 33 _2 __ //qr8,er8和er10是有用的
D950 E4 5E _1 __ __ __ //r2 = r0; pop er0
D956 20 8F _0 __ 76 D9 __ __ //er2 += er10; r0 = 0; er10 = *er8; \
er2 += er10; *er8 = er2; pop xr8 \
(er2=(48key)+482C+[D940])([D940]==41D0)注意er8=D976
D95E A8 21 _1 __ 78 D9 //er0 = D978
D964 C8 03 _2 __ //strcpy(er0, er2),er2根据按键不同可能是D20C或D23C
D968 34 61 _1 __ (ptr) (key) //er0 = ptr; er2 = key
D970 28 8F _0 __ E0 D8 (key) //er8 = D8E0; er10 = key
接下来根据按键不同产生分支


  • EwTE_H
  • 991CNX
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
分支1,D964处er2=D20C:
D978 0E 81 _1 __ //r0 = *er0
D97C E4 5E _1 __ (ptr) //r2 = r0; er0 = ptr,ptr是从D214处复制过来的
D982 26 8F E0 D8 16 E2 _0 __ // er2 += er10; *er8 = er2; pop xr8 \
给er8设的D8E0只是一个好打而没用的地址,pop xr8也没用,只是用来使指令交叉
D98A CE 8B _1 __ //*er0 = r2
分支2,D964处er2=D23C:
D978 6C C0 _0 __ 8A D1 //er8 = D18A
D97E 24 8F _0 __ 26 8F E0 D8 //[D18A]+=er2
D986 16 E2 _0 __ CE 8B _1 __ //pop xr8,用来占位并使指令交叉


  • EwTE_H
  • 991CNX
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最后分支合并:
D98E 34 61 _1 __ A7 D9 01 __ //er0 = D9A7; r2 = 01
D996 D2 03 _2 __ //*er0 = r2([D9A7]=01)
D99A 34 61 _1 __ A6 D8 3A D1 //er0 = D8A6; er2 = D13A
D9A2 CE EB E0 D8 00 01 //memcpy(er0, er2, 0101); \
jump er14; pop xr4; pop qr8
循环重启


  • EwTE_H
  • 991CNX
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最后的memcpy有两点需要注意:
1 这里并没有给er14赋值,但是为什么能跳转呢?观察memcpy的源码(节选):
022DC4 5E FE PUSH ER14
022DC6 1A AE MOV ER14, SP
022DC8 5E FC PUSH ER12
022DCA 5E F8 PUSH ER8
022DCC 5E F4 PUSH ER4
可以发现最开头有一个push er14的操作,那么最后就要pop er14。而在复制的过程中,memcpy自己的栈被覆盖了,因此最后pop出来的er14就是D9A4处的D8E0。
2 为什么要先给[D9A7]赋值,而不能直接复制?继续观察memcpy的源码(节选):
022DD6 45 F0 MOV ER0, ER4
022DD8 C0 92 L R2, [ER12]
022DDA 41 92 ST R2, [ER4]
022DDC 81 E0 ADD ER0, #1
022DDE 05 F4 MOV ER4, ER0
022DE0 81 EC ADD ER12, #1
022DE2 42 B0 L ER0, 02h[FP]
022DE4 FF E0 ADD ER0, #-1
022DE6 C2 B0 ST ER0, 02h[FP]
022DE8 00 E0 MOV ER0, #0
022DEA 42 B2 L ER2, 02h[FP]
022DEC 27 F0 CMP ER0, ER2
022DEE F3 C1 BC LT, 22DD6h
调用memcpy时栈顶的那两个字节就是给它的复制长度。只有当这两个字节为0时,循环才会退出,因此任何复制过程都会把这两个字节变成0,只能手动赋值。除此之外,为什么复制长度是0101和0100呢?如果复制长度是0100,那就只会复制到D9A5为止;如果复制长度是0101,那么复制到D9A5时,剩余的复制长度是0001,接下来复制D9A6,由于D23A处的值也是01,所以复制了等于没复制,减一以后就退出循环了。这样,可以避免复制到后面的区域(如果多复制,就至少要多复制256字节),同时还能保证复制到一切必要的数据。


  • 生姜一片jj
  • TI-84+
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好厉害的思路!lznb这应该是f吧第一个带条件跳转的ROP链了
利用POP XRn/QRn来交替执行指令确实是非常巧妙的方法,我原本的猜想是通过提供特定的按键码使某一种操作无效


  • 贴吧用户_GbJaDKM
  • 991CNX
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
那些“__”是干什么的?好久不研究计算器不太懂了


2025-06-13 13:01:03
广告
  • EwTE_H
  • 991CNX
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这段代码怎么输入呢?代码中有很多只能用@刷的字,qiufuyu老师给过一个刷14字符的办法,但是我们这里不够用。不过这次用的an位移(132an)比较大,足够我们使用那个方法的拓展版:
在进入an之前,先给变量赋值:D=1.0000(前6字节),M=1.(8字节),F=1.(8字节),x=1.(8字节)+(8字节)i
进入an以后,刷出shift748和shift714(shift748在前面),然后输入这个式子:
Min>cm: ((M)): x: @=D: @=F
CALC,5次=,↑,就会看到你刷的字符了,效果图如下
(lz比较穷,就拿24做例子……)

如果把所有的1.xxxx都换成-2.xxxx,空格就会变成@,刷空格还是@全看个人选择。我个人喜欢刷空格,不容易搞混。
这些字符刷完以后,还需要一些不能直接打出,但是可以用字符转换器刷出的字,这个用基本溢出法即可。


  • EwTE_H
  • 991CNX
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
操作方法:
- 当前字符-2,÷ -1,AC +1,S<=>D +5,cos +13,log +29,∫ +61
= 左移2格,Ans 左1,x10x 右1,. 右5, 0 右13
可以看出它们分别对应KO5和KO7


  • usrlocal
  • TI-84+
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
还是有些部分没看明白
D93E 26 8F D0 41 __ __ (key) 这里是[D96E]=key+BFFD吧
D970 28 8F _0 __ E0 D8 (key) 这里的 (key) 是在哪里设置的? 虽然有 D956 20 8F _0 __ 76 D9 __ __, 但是后面没有对*er8的赋值了啊
D964 C8 03 _2 __ //strcpy(er0, er2),er2根据按键不同可能是D20C或D23C(这里er2为什么只有这两个值(每太看明白er2怎么算的


  • EwTE_H
  • 991CNX
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最后说几句闲话
为了写这个程序真是爆肝,我初稿长达252字节,第二天缩到210字节,但是最后缩到现在的196字节花了我整整5天。最近我也没有更多精力去写程序了。只希望这个程序能给吧友们带来一点帮助。
希望991cnx全屏拼图早日实现!


  • qiufuyu123
  • TI-36XP
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
其实国外已经有人做出了991es的loader程序
里面条件语句用的是"跳转表"的思路实现
跟lz的思路很想


本来有空打算按这个思路写一个编辑器,没想到lz先了一步


  • 可爱的Fixed
  • DY120
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
*顶楼* 看不懂就是了(悲
可惜家里没有卡西欧计算器


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 18回复贴,共1页
<<返回fx-es(ms)吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示